我是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);
});
}
};
目的是将finalResult变量转换为JSON并通过res.send提供它,就像API一样。
正如您所看到的,我尝试从函数返回数据,但我认为与Node的工作原理并不一致。我尝试过使用res.send甚至res.render,但这两个都返回“X不是函数”。
我知道我需要以某种方式使用回调,但此时我完全迷失了。
答案 0 :(得分:1)
将res
对象传递到search
函数,然后您可以在该函数中调用res.send()
。
将其声明为参数:
search : function(res, query, pagination) {
传递给:
router.get('/imagesearch/:query', function(req, res) {
imgur.search(res, 'cats', '2');
});
然后,在search
功能的实施过程中,您可以随时拨打res.send(...)
。
或者,您可以让search
函数返回一个承诺,当您获得异步结果时,您将使用结果解析该承诺,然后您的路由器可以使用该承诺来获取结果。
答案 1 :(得分:1)
以一种很好的方式做到这一点的两种方法。您应该在调用函数时处理响应,而不是像某些人建议的那样将其传递给搜索:
imgur.search('cats', '2', function (data) {
res.send(data) // call callback with data and send or whatever you want
});
然后在搜索中:
function search(query, pagination, cb) {
// Do stuff
cb(null, data);
}
imgur
.search('cats', 2)
.then(function (data) {
res.send(data) // Or whatever
})
要做2.您需要从搜索功能返回一个承诺(我的例子是使用蓝鸟)
var Promise = require('bluebird');
function search(query, pagination) {
return new Promise(function (resolve, reject) {
// Do stuff
return resolve(data);
}
}