使用路由文件之外的res.send()

对于Node JS和Express,我很新,所以如果这个问题到处都是道歉的话。

在我的一个路线中,我在一个单独的模块中调用一个函数:

var express = require('express'); var router = express.Router(); var imgur = require('../helpers/imgur.js'); router.get('/imagesearch/:query', function(req, res) { imgur.search('cats', '2'); }); module.exports = router; 

Imgur帮手文件目前看起来像这样:

 const https = require('https'); module.exports = { search : function(query, pagination) { var options = { host: 'api.imgur.com', path: '/3/gallery/search/hot/' + pagination + '?q=' + query, port: 443, method: 'GET', headers: {'Authorization' : 'Client-ID ' + process.env.API_KEY} }; var callback = function(res) { var str = ''; res.on('data', function(chunk) { str += chunk; }); res.on('end', function() { var result = JSON.parse(str); result = result.data; var finalResult = []; for(var key in result) { url = result[key].link; title = result[key].title; points = result[key].points; var temp = {url: url, title: title, points: points}; finalResult.push(temp); } return finalResult; }); }; var req = https.request(options, callback); req.end(); req.on('error', function(e) { console.error(e); }); } }; 

目的是将finalResultvariables转换为JSON,并通过res.send提供,就像API一样。

正如你所看到的,我试图从函数中返回数据,但是我不认为Node与Node的工作方式是一致的。 我试过使用res.send甚至res.render,但这两个返回“X不是一个函数”。

我知道我需要使用一个callback,但在这一点上,我完全失去了。

res对象传递给您的search函数,然后您可以从该函数内调用res.send()

声明它作为一个参数:

 search : function(res, query, pagination) { 

通过它:

 router.get('/imagesearch/:query', function(req, res) { imgur.search(res, 'cats', '2'); }); 

然后,从searchfunction的实现中,您可以随时调用res.send(...)


或者,您可以让searchfunction返回一个承诺,当您有asynchronous结果时,您可以使用结果来parsing,然后您的路由器可以使用该承诺来获得结果。

两种方法可以很好地完成这个任务。 你应该在你调用函数的地方处理响应,而不是像某些人所说的那样把它传递给search:

1.发回电话到search

 imgur.search('cats', '2', function (data) { res.send(data) // call callback with data and send or whatever you want }); 

然后在search:

 function search(query, pagination, cb) { // Do stuff cb(null, data); } 

2.使用承诺

 imgur .search('cats', 2) .then(function (data) { res.send(data) // Or whatever }) 

要做2.你需要从searchfunction返回一个承诺(我的例子是使用蓝鸟)

 var Promise = require('bluebird'); function search(query, pagination) { return new Promise(function (resolve, reject) { // Do stuff return resolve(data); } }