【问题标题】:Sending/handling GET requests in typescript using Express, Request and Node.js使用 Express、Request 和 Node.js 在 typescript 中发送/处理 GET 请求
【发布时间】:2016-07-21 12:40:44
【问题描述】:

我正在使用 Express 和 Request 的组合(使用 npm 安装)来尝试发送 get 请求以从服务器获取一些 json。但是,无论我做什么,返回的主体都是“未定义的”。

这是我的 server.js 文件中的代码。 json 实际上并不是我发送的内容,它只是一个示例,因为我无法发布我实际发送的内容。

import express = require("express");
import bodyParser = require("body-parser");
let app = express();
app.use(bodyParser.json());

app.get('/config', function(req, res){
    res.json('{name: test}');
})

app.listen(3000);

我已经尝试了以下两种方法,但它们都说 body 是未定义的。

import request = require("request");

let req = {
    url: `http://localhost:3000/config`,
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    }
}

request(req, function(error, response, body){
    this.config = JSON.parse(body);
})

request(`/config`, function(err, res, body) {
    this.config = JSON.parse(body);
});

有谁知道我做错了什么?我以前从未使用过 express 或 request,因此我们将不胜感激。


更新

如果我将请求代码更改为以下代码,则函数内部永远不会运行。有谁知道为什么会这样?

let req = {
    url: `http://localhost:3000/config`,
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    }
}

request(req, function(error, response, body){
    console.log("response => "+JSON.parse(body));
    return JSON.parse(body);
})

【问题讨论】:

  • 我复制粘贴了您的第一个示例代码,然后我使用postman 返回了“{name: test}”。这是您期望的输出吗?
  • 是的,这就是我想要的。我想那一定是我的请求内容有问题。
  • 不确定。我只是在做一个简单的 "GET" 。空头。也许值得看看您用来进行调用的工具或 API,也许它正在为原始响应添加一些胡椒和盐。我还会检查 HTTP 响应代码并确保它没有收到 404。
  • 在客户端代码中 - 你的 url 应该是 localhost:3000/config。
  • 当我在邮递员中执行此操作时,它显示“无法获取/配置”。你是如何得到回复的?

标签: node.js express typescript npm-request


【解决方案1】:

由于 OP 没有让它工作,我相信他在那里得到的代码是正确的。我不妨在这里发布我的工作解决方案以帮助他开始。

希望这可以为您节省数小时的调试时间...

客户:

"use strict";
let request = require("request");

let req = {
    url: `localhost:4444/config`,
    proxy: 'http://localhost:4444',
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    }
};

request(req, function (err, res, body) {
    this.config = JSON.parse(body);
    console.log("response => " + this.config);
});

服务器:

"use strict";
var express = require("express");
var bodyParser = require("body-parser");
var app = express();
var config = require('config');
app.use(bodyParser.json());

app.get('/config', function(req, res){
    res.json('{name: test}');
});

// Start the server
app.set('port', 4444);

app.listen(app.get('port'), "0.0.0.0", function() {
    console.log('started');
});

输出:

响应 => {名称:测试}

【讨论】:

  • @annedroide 让我知道这是否适合您。注意我在这里使用了不同的端口。 4444
  • 当我把它放进去时,我得到“错误:无效的协议:本地主机:”
  • @annedroiid 无法复制它...我将删除该代理行,看看会发生什么...
【解决方案2】:

不知道你有没有贴出你服务器的全部代码,好像你错过了app.listen(port),导致你的服务器无法正常启动。

另外,如果你在request的回调函数的第一行添加if (error) { console.log(error); },你会发现它打印一个错误:[Error: Invalid URI "/config"]

这就是为什么body 总是undefined 的原因:您必须将完整的网址(例如http://localhost:xxxx)提供给request。

简而言之:

  • 您的服务器未侦听特定端口。 app.listen(5678)
  • 您的客户不知道完整的网址。 request('http://localhost:5678/config', (...)=>{...})

【讨论】:

  • 设置为自动使用本地主机。我也有 app.listen(3000) 到端口,我只是忘了把它包括在我的评论中。
  • 自动使用本地主机?你的意思是你的客户要求吗?不会的,恕我直言。而且您没有告诉客户端应该将请求发送到哪个端口。只需打印有关错误的日志,您就会知道它不起作用的原因。错误消息总是非常有用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 2015-08-31
  • 1970-01-01
  • 2012-03-23
相关资源
最近更新 更多