我想从路线中取出我的CRUD逻辑并将其放入服务层。
所以基本上我想像这样调用服务层:
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")
})
})
在我的postService.js
文件中,我有以下功能:
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])
})
}
目前我正在使用callback
来处理此功能。
任何建议如何使用更基于承诺的样式来返回id,并且路由器中的代码在承诺完成时等待?
感谢您的回复!
答案 0 :(得分:2)
在您的示例中,您可以删除callback
参数并返回knex
createPost(...) {
...
return knex('posts').insert(post, "id");
}
然后在你的路线中你可以await
结果
router.post('/new', async (req, res) => {
const id = await service.createPost(...);
console.log("Created post with id: " + id[0]);
res.redirect("index");
});
或者,如果您想预处理来自knex
的响应(因为它返回一个数组),那么您可以返回一个新的Promise
async createPost(...) {
...
const result = await knex('posts').insert(...);
return result[0];
}
FWIW我建议使用后者,因为它可以在各层之间提供清晰的分离。