请问一个 nodejs 提供 api 的问题

2015-10-25 23:06:54 +08:00
 nuptxxp
新人请问一个问题:
最近一个平台需要提供 API 给外界,但是我在 api 里面又要访问别的 api ,现在跑的时候提示错误,请问有大神能解答么。
代码大约这个样子。
router.get('/', function(req, res){
var apiUrl = '';
$http.get(apiUrl + '/products', {
})
.success(function (data) {
res.json(data);
})
.error(function (data, status) {
res.json({"code":1,"msg":fail});
});
});
2231 次点击
所在节点    程序员
7 条回复
nuptxxp
2015-10-25 23:13:38 +08:00
主要我发现给别人 api 应该是同步返回的,但是 nodejs 模式又是异步的,不知到是不是这样导致问题。
还有报错是
TypeError: listener must be a function
at TypeError (native)
at ClientRequest.once (events.js:190:11)
at new ClientRequest (_http_client.js:93:10)
at Object.exports.request ( http.js:49:10)
at Object.exports.get ( http.js:53:21)
oott123
2015-10-26 00:49:14 +08:00
看上去没有什么太多问题。
而且这也不是同步的,也是异步的。
imdjh
2015-10-26 07:50:29 +08:00
@nuptxxp


你错了几个点:
http.get 返回的是 ClientRequest 类,是没有 success/error 方法的,需要用 on 方法监听事件。
success 是当服务器接收到头请求,返回 200 时被激发的,所以看你的要求应该监听返回的 response 事件(调用内部 api 的返回)。
异步传回来的对象被引用到 http.get()定义的回调函数的第一个参数中,是 IncomingMessage 的实例,用 data 方法就能得到你要异步 api 数据啦。
imdjh
2015-10-26 07:54:24 +08:00
var express = require('express');
var router = express.Router();
var http = require('http');

// 我的实现,测试通过,欢迎提出疑问。
router.get('/', function(req, res){
var apiUrl = 'http://www.djh.im';
var data;
(function (theres) {
var pres = theres;
http.get(apiUrl + '/', function (res) {
res.on('data', function (d) {
data = d;
pres.send(data.toString());
});
})
.on('success', function (data) {
res.send(data);
})
.on('error', function (data, status) {
res.json({"code":1,"msg":fail});
});
})(res);
});
module.exports = router;
imdjh
2015-10-26 08:04:32 +08:00
@nuptxxp
又看了眼, 4L 那个有问题!!
fix: 要把 send 改为 end ,不然无法被调用两次 =O

于是乎把各个地方简化了下:
var express = require('express');
var router = express.Router();
var http = require('http');

// 我的实现,测试通过^2 ,欢迎提出疑问。
router.get('/', function(req, res){
var apiUrl = 'http://www.djh.im';
(function (theres) {
var pres = theres;
http.get(apiUrl + '/', function (res) {
res.on('data', function (d) {
pres.end(d.toString());
});
})
.on('error', function (data, status) {
res.json({"code":1,"msg":fail});
});
})(res);
});
module.exports = router;
will0404
2015-10-26 09:41:40 +08:00
把给别人数据的方法写在你从后台得到数据的回调方法里 不知道我这样说清楚吗 你是用 node 做接入层吧
nuptxxp
2015-10-26 19:19:41 +08:00
谢谢大家,问题解决了,多谢^-^

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/231023

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX