V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nuptxxp
V2EX  ›  程序员

请问一个 nodejs 提供 api 的问题

  •  
  •   nuptxxp · 2015-10-25 23:06:54 +08:00 · 2199 次点击
    这是一个创建于 3111 天前的主题,其中的信息可能已经有所发展或是发生改变。
    新人请问一个问题:
    最近一个平台需要提供 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});
    });
    });
    7 条回复    2015-10-26 19:19:41 +08:00
    nuptxxp
        1
    nuptxxp  
    OP
       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
        2
    oott123  
       2015-10-26 00:49:14 +08:00 via Android
    看上去没有什么太多问题。
    而且这也不是同步的,也是异步的。
    imdjh
        3
    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
        4
    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
        5
    imdjh  
       2015-10-26 08:04:32 +08:00   ❤️ 1
    @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
        6
    will0404  
       2015-10-26 09:41:40 +08:00 via iPhone
    把给别人数据的方法写在你从后台得到数据的回调方法里 不知道我这样说清楚吗 你是用 node 做接入层吧
    nuptxxp
        7
    nuptxxp  
    OP
       2015-10-26 19:19:41 +08:00
    谢谢大家,问题解决了,多谢^-^
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2289 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:57 · PVG 11:57 · LAX 20:57 · JFK 23:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.