【问题标题】:Proper return for service functions in nodejs web applications to respond to client synchronouslynodejs web应用程序中服务函数的正确返回以同步响应客户端
【发布时间】:2018-03-09 13:23:34
【问题描述】:

我在下面发布了我的节点 Web 应用程序的近似值。我最初遇到的问题是,我希望能够在发帖到createentity 时让客户知道插入是否成功以及插入实体的 id。但是,connection.query 有一个回调而不是同步运行,我不能使用 entityservice 在另一种语言中的期望,即简单地同步返回结果。有几种解决方案,我很好奇哪一个是 node.js 的最佳/常见做法,或者是否还有其他我没有想到的。

  1. 将资源传递给服务,并在回调中响应;似乎不好的做法
  2. 类似地,将在成功/失败后执行的函数传递给服务;似乎也很糟糕
  3. 从服务返回承诺并根据解决方案/失败设置资源;似乎服务不应该返回承诺,但我是节点的新手
  4. 使用我不知道的 node.js 的适当功能的一些更好的方法
  5. 尝试更改服务以使其同步运行并仅返回结果 其他问题/答案让我怀疑这是可能的还是明智的
  6. 以其他方式构建应用程序
  7. 还有别的吗?

//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();

【问题讨论】:

  • EntityService() 应该返回一个承诺(在异步工作完成时解决)或将回调作为参数(在异步工作完成时调用),然后调用EntityService 可以使用它来了解工作何时完成以及何时发送响应。

标签: node.js promise node-mysql


【解决方案1】:

这里的正确方法是选项 3 - 让您的服务返回一个 Promise

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));
  });
})

【讨论】:

    【解决方案2】:

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

    您的服务返回一个承诺,然后您的调用代码可以这样做:

    app.post('/createentity', urlencodedParser, async function(req, res){ 常量实体 = 等待 EntityService.createEntity(req.body.name); res.status(200).json(实体); });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多