适当 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 或者是否还有其他我没有想到的。
- 将资源传递给服务,并在回调中做出响应;似乎不好的做法
- 同理,将success/failure后执行的函数传递给服务;也似乎是不好的做法
- 从服务返回承诺并根据resolution/failure设置资源;似乎服务不应该 return 承诺,但我是节点
的新手
- 使用 node.js 的适当功能的一些更好的方法,我不知道
- 尝试更改服务,使其同步运行,然后 return 获取结果其他 questions/answers 让我怀疑这是可能的还是明智的
- 以其他方式构建应用程序
- 还有别的吗?
//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(实体);
});
我在下面 post 编辑了我的节点 Web 应用程序的近似值。我最初遇到的问题是,我希望能够在 post 到 createentity
上让客户端知道插入是否成功以及插入的实体的 id。但是,connection.query
有回调而不是 运行 同步,我不能使用 entityservice
我期望的另一种语言,即简单地 return 同步结果.有几种解决方案,我很好奇 best/common 练习 node.js 或者是否还有其他我没有想到的。
- 将资源传递给服务,并在回调中做出响应;似乎不好的做法
- 同理,将success/failure后执行的函数传递给服务;也似乎是不好的做法
- 从服务返回承诺并根据resolution/failure设置资源;似乎服务不应该 return 承诺,但我是节点 的新手
- 使用 node.js 的适当功能的一些更好的方法,我不知道
- 尝试更改服务,使其同步运行,然后 return 获取结果其他 questions/answers 让我怀疑这是可能的还是明智的
- 以其他方式构建应用程序
- 还有别的吗?
//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(实体); });