Node.js 正确返回nodejs web应用程序中的服务功能以同步响应客户端

Node.js 正确返回nodejs web应用程序中的服务功能以同步响应客户端,node.js,promise,node-mysql,Node.js,Promise,Node Mysql,我在下面发布了我的节点web应用程序的近似值。我遇到的最初问题是,我希望能够在post to createentity上让客户端知道插入是否成功以及插入的实体的id。然而,connection.query有回调而不是同步运行,我不能像我在另一种语言中所期望的那样使用entityservice,即简单地同步返回结果。有几种解决方案,我很好奇re node.js的最佳/常见做法是什么,或者我是否考虑过其他解决方案 将res向下传递给服务,并在回调中响应;这似乎是拙劣的做法 类似地,将成功/失败后要执

我在下面发布了我的节点web应用程序的近似值。我遇到的最初问题是,我希望能够在post to createentity上让客户端知道插入是否成功以及插入的实体的id。然而,connection.query有回调而不是同步运行,我不能像我在另一种语言中所期望的那样使用entityservice,即简单地同步返回结果。有几种解决方案,我很好奇re node.js的最佳/常见做法是什么,或者我是否考虑过其他解决方案

将res向下传递给服务,并在回调中响应;这似乎是拙劣的做法 类似地,将成功/失败后要执行的函数传递给服务;也似乎是拙劣的做法 从服务返回承诺,并根据解决/失败设置res;似乎服务不应该回报承诺,但我对node是新手 使用node.js的适当功能的一些更好的方法,我不知道 尝试更改服务以使其同步运行,并仅返回结果其他问题/答案使我怀疑这是可能的或明智的 以其他方式构造应用程序 还有别的吗? //app.js var express=需要“express”; var bodyParser=需要“body-parser” var path=需要“路径”; var EntityService=require'/EntityService.js'; var-app=express; var urlencodedParser=bodyParser.urlencoded{extended:true} app.post'/createentity',urlencodedParser,functionreq,res{ EntityService.createEntityreq.body.name; res.status200.jsonnull; }; app.listen3000; //entityService.js var mysql=require'mysql'; 实体服务=功能{ var connection=mysql.createConnection{ 主机:连接IP, 用户:'根', 密码:“password”, 数据库:“entitydb” }; 连接,连接; this.createEntity=functionname{ var记录={name:'name'}; var query=connection.query“插入实体集”,记录,函数错误,结果,字段{ //要从服务返回results.insertId吗 }; } }
module.exports=新实体服务 正确的方法是选择3——让您的服务回报承诺

this.createEntity = name => new Promise((resolve, reject) => {
  const query = connection.query('...', { name }, (err, results) => {
    if (err) return reject(err);

    return resolve(results.map(r => r.insertId));
  });
})

如果您使用的是Node的最新版本,我将使用asynch/await语法

您的服务返回承诺,然后您的呼叫代码可以执行以下操作:

app.post'/createentity',urlencodedParser,异步functionreq,res{ const entity=await EntityService.createEntityreq.body.name; res.status200.jsonentity; };

EntityService应该返回一个承诺,该承诺在异步工作完成时解析,或者将回调作为参数,在异步工作完成时调用回调,然后EntityService的调用方可以使用该参数来知道工作何时完成以及何时发送响应。