目前正在使用npm请求,我想将我的代码重构为以下内容:
app.post('/work_order',function (req,res) {
var work_order = req.body.work_order;
var url = soapURI + work_order;
reqMethod(url);
});
app.get('/work_order/:work_order', function (req, res) {
var work_order = req.params.work_order;
var url = soapURI + work_order;
reqMethod(url);
});
function reqMethod (url){
request({
url: url,
json: true
}, function (error, response, body) {
if (!error && response.statusCode === 200) {
// console.log(body); // Print the json response
res.send(body);
}
});
}
问题是reqMethod
现在是一个承诺,res.send(body)
是其中的一部分。我不能简单return res.send(body)
。我有两个重复的代码片段(每个代码都与方法完全相同)位于.get
和.post
,所以我想将它们移到一个通用的,可重用的方法中。
问题:
我如何才能让它发挥作用?
request
是一个好的npm模块吗?你能否提出一些替代方案,也许还有更好的选择?
谢谢
答案 0 :(得分:1)
您有2个选项。
选项1:将结果(res)参数传递给reqMethod:
app.post('/work_order',function (req,res) {
var work_order = req.body.work_order;
var url = soapURI + work_order;
reqMethod(url, res);
});
app.get('/work_order/:work_order', function (req, res) {
var work_order = req.params.work_order;
var url = soapURI + work_order;
reqMethod(url, res);
});
function reqMethod (url, res){
request({
url: url,
json: true
}, function (error, response, body) {
if (!error && response.statusCode === 200) {
// console.log(body); // Print the json response
res.send(body);
}
else {
//send error here
}
});
}
选项2:向reqMethod添加回调
app.post('/work_order',function (req,res) {
var work_order = req.body.work_order;
var url = soapURI + work_order;
reqMethod(url, function(err, body) {
res.send(body)
);
});
app.get('/work_order/:work_order', function (req, res) {
var work_order = req.params.work_order;
var url = soapURI + work_order;
reqMethod(url, function(err, body) {
res.send(body)
);
});
function reqMethod (url, cb){
request({
url: url,
json: true
}, function (error, response, body) {
if (!error && response.statusCode === 200) {
// console.log(body); // Print the json response
cb(null, body);
}
else {
cb(error)
}
});
}
答案 1 :(得分:1)
Express请求处理程序需要在其自己的作用域中使用res.send()
,或者需要将所需的变量传递给您的帮助函数,以便可以在那里使用res
。
当使用promises作为Express请求处理(而不是回调)的基础时,使用Bluebird promise可以实现更简单的错误处理流程。
ES6 promises库提供了一个非常有用的标准Promise功能超集。自{4.}
以来,Needle一直是本机Node.js的一部分 Bluebird promisified执行到目前为止我所需要的所有HTTP,并且它比request
重得多,轻得多。
const Promise = require('bluebird');
const needle = Promise.promisifyAll(require('needle'));
function expressResponse (req, res, next, promisedResponse) {
return promisedResponse
.then( (result) => res.send(result) )
.catch( next );
}
function reqMethod (url) {
return needle
.getAsync( url, {json: true} )
.then( (response) => {
if ( response.statusCode !== 200 )
throw new Error('Status '+response.statusCode);
return response.body;
});
}
app.get('/work_order', function (req, res, next) {
let work_order = req.body.work_order;
let url = soapURI + work_order;
expressResponse( req, res, next, reqMethod(url) );
});
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send(err.message)
})
expressResponse()
使Express组件与任何响应生成代码分开,以防我想将这些函数用于express之外的其他函数。
reqMethod()
会从Express error handling middleware needle.getAsync()
返回一个承诺,该承诺会调用needle.get()
并自动将回调转换为您的承诺。
已将next
添加到Express请求处理程序方法签名中,并将其传递给expressResponse()
。然后.catch(next)
附加到promise链。这将允许Express处理承诺抛出的任何未捕获的异常。
使用next()
错误处理需要添加{{3}}。您可以使Error
知道更多,为不同的Error
类生成不同的响应。
请注意,使用Promises,您现在可以在throw
中的异步Promise中安全地reqMethod()
正常异常,并且它们将由Express错误中间件处理。