2017-10-01 2 views
0

Ich möchte meine CRUD Logic aus den Routen herausnehmen und in eine Serviceebene einfügen.Codierung der Serviceebene mit Versprechen

Also im Grunde mag ich so das Service-Layer nennen:

const service = require("../service/post") 

router.post("/new", (req, res) => { 
    service.createPost(req.body.titel, req.body.description, req.body.tags, function(id){ 
     console.log("Created post with id: " + id) 
     res.redirect("index") 
    }) 
}) 

In meiner postService.js Datei habe ich die folgende Funktion:

function createPost(titel, description, tags, callback) { 

    const post = { 
     titel: titel, 
     description: description, 
     tags: tags, 
     createdAt: new Date(), 
     deleted: false, 
    } 
    console.log("Create Post: " + post.titel + " " + post.description + " " + post.tags + " " + post.createdAt + " " + post.deleted) 

    knex("posts").insert(post, "id").then(id => { 
     console.log(id) 
     callback(id[0]) 
    }) 
} 

Derzeit ich callback bin mit dieser Funktion zu handhaben .

Irgendwelche Vorschläge, wie man einen vielversprechenderen Stil verwendet, um die ID zurückzugeben, und der Code im Router wartet, wenn das Versprechen abgeschlossen ist?

Vielen Dank für Ihre Antworten!

Antwort

2

In Ihrem Beispiel können Sie Ihre callback Parameter loszuwerden und das Versprechen von knex

createPost(...) { 
    ... 
    return knex('posts').insert(post, "id"); 
} 

Dann in Ihrer Route zurück kehren Sie das Ergebnis

router.post('/new', async (req, res) => { 
    const id = await service.createPost(...); 
    console.log("Created post with id: " + id[0]); 
    res.redirect("index"); 
}); 

Alternativ, wenn Sie await können möchte die Antwort von knex vorverarbeiten (da es ein Array zurückgibt), dann können Sie eine neue Promise

zurückgeben
async createPost(...) { 
    ... 
    const result = await knex('posts').insert(...); 
    return result[0]; 
} 

FWIW Ich würde letzteres empfehlen, da es eine saubere Trennung zwischen den Schichten bietet.

+0

Eine Sache, die ich extra tun würde, ist in einem Versuch außer zu wickeln. Node.JS wird derzeit einen Fehler protokollieren, aber in Zukunft möglicherweise nur die App beenden. Grundsätzlich müssen alle End-Point-Versprechungen in node.js wirklich behandelt werden. – Keith

+0

@Keith Fehlerbehandlung aus Platzmangel weggelassen, aber ja ich stimme zu, haben die Service-Schicht vollständig die Speicherfehler einkapseln. – James