适当 return 用于 nodejs web 应用程序中的服务功能以同步响应客户端

Proper return for service functions in nodejs web applications to respond to client synchronously

我在下面 post 编辑了我的节点 Web 应用程序的近似值。我最初遇到的问题是,我希望能够在 post 到 createentity 上让客户端知道插入是否成功以及插入的实体的 id。但是,connection.query 有回调而不是 运行 同步,我不能使用 entityservice 我期望的另一种语言,即简单地 return 同步结果.有几种解决方案,我很好奇 best/common 练习 node.js 或者是否还有其他我没有想到的。

  1. 将资源传递给服务,并在回调中做出响应;似乎不好的做法
  2. 同理,将success/failure后执行的函数传递给服务;也似乎是不好的做法
  3. 从服务返回承诺并根据resolution/failure设置资源;似乎服务不应该 return 承诺,但我是节点
  4. 的新手
  5. 使用 node.js 的适当功能的一些更好的方法,我不知道
  6. 尝试更改服务,使其同步运行,然后 return 获取结果其他 questions/answers 让我怀疑这是可能的还是明智的
  7. 以其他方式构建应用程序
  8. 还有别的吗?

//app.js 

var express = require('express');
var bodyParser = require('body-parser')
var path = require('path');

var EntityService = require('./entityService.js');

var app = express();
var urlencodedParser = bodyParser.urlencoded({ extended: true })

app.post('/createentity', urlencodedParser, function(req, res){
  EntityService.createEntity(req.body.name);
  res.status(200).json(null);
});

app.listen(3000);

//entityService.js

var mysql = require('mysql');

EntityService = function(){

  var connection = mysql.createConnection({
    host     : CONNECTION_IP,
    user     : 'root',
    password : 'password',
    database : 'entitydb'
  });

  connection.connect();

  this.createEntity = function(name){
    var record = {name: 'name'};
    var query = connection.query('INSERT INTO entity set ?', record, function(error, results, fields ){
      //want to return the results.insertId from the service
    });
  }
}

module.exports = new EntityService();

此处正确的方法是选项 3 - 让您的服务 return 一个承诺

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 语法。

你的服务returns一个承诺,那么你的调用代码可以做到:

app.post('/createentity', urlencodedParser, 异步函数(req, res){ const entity = await EntityService.createEntity(req.body.name); res.status(200).json(实体); });