因此,可以尝试获取以下JSON对象:
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json; charset=ISO-8859-1
Date: Wed, 30 Oct 2013 22:19:10 GMT
Server: Google Frontend
Cache-Control: private
Alternate-Protocol: 80:quic,80:quic
Transfer-Encoding: chunked
{
"anotherKey": "anotherValue",
"key": "value"
}
$
有没有办法在使用node或express的服务器的响应中生成完全相同的主体?显然,可以设置标头并指示响应的内容类型将是“application / json”,但是有不同的方式来编写/发送对象。我通常使用的那个是使用以下形式的命令:
response.write(JSON.stringify(anObject));
然而,这有两点可以说是好像是“问题”:
另一个想法是使用命令:
response.send(anObject);
这似乎是基于curl的输出发送一个JSON对象,类似于上面的第一个例子。但是,当在终端上再次使用卷曲时,在身体的末端没有新的线条字符。那么,如何使用node或node / express在最后附加一个新行字符来实际写下这样的东西?
答案 0 :(得分:511)
该响应也是一个字符串,如果你想发送美化的响应,出于某些尴尬的原因,你可以使用像JSON.stringify(anObject, null, 3)
这样的东西
将Content-Type
标题设置为application/json
也很重要。
var http = require('http');
var app = http.createServer(function(req,res){
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ a: 1 }));
});
app.listen(3000);
// > {"a":1}
美化:
var http = require('http');
var app = http.createServer(function(req,res){
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ a: 1 }, null, 3));
});
app.listen(3000);
// > {
// > "a": 1
// > }
我不确定你为什么要用换行符来终止它,但是你可以JSON.stringify(...) + '\n'
来实现它。
在快递方面,您可以changing the options instead执行此操作。
'json replacer'
JSON替换器回调,默认为null
'json spaces'
用于格式化的JSON响应空间,在开发中默认为2,在生产中默认为
实际上并不建议设置为40
app.set('json spaces', 40);
然后你可以回复一些json。
res.json({ a: 1 });
它将使用'json spaces
'配置来美化它。
答案 1 :(得分:350)
由于Express.js 3x,响应对象有一个json()方法,它为您正确设置所有标头并以JSON格式返回响应。
示例:
res.json({"foo": "bar"});
答案 2 :(得分:18)
如果您尝试发送json文件,可以使用流
var usersFilePath = path.join(__dirname, 'users.min.json');
apiRouter.get('/users', function(req, res){
var readable = fs.createReadStream(usersFilePath);
readable.pipe(res);
});
答案 3 :(得分:4)
你可以使用管道和许多处理器中的一个来美化它。您的应用应始终以尽可能小的负载响应。
$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print
答案 4 :(得分:3)
在大多数情况下,res.json()
function就足够了。
app.get('/', (req, res) => res.json({ answer: 42 }));
res.json()
函数将使用JSON.stringify()
和sets the Content-Type
header传递给JSON的参数转换为application/json; charset=utf-8
,以便HTTP客户端知道自动解析响应。
答案 5 :(得分:2)
您可以使用中间件设置默认的Content-Type,并为特定API设置不同的Content-Type。这是一个例子:
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
const server = app.listen(port);
server.timeout = 1000 * 60 * 10; // 10 minutes
// Use middleware to set the default Content-Type
app.use(function (req, res, next) {
res.header('Content-Type', 'application/json');
next();
});
app.get('/api/endpoint1', (req, res) => {
res.send(JSON.stringify({value: 1}));
})
app.get('/api/endpoint2', (req, res) => {
// Set Content-Type differently for this particular API
res.set({'Content-Type': 'application/xml'});
res.send(`<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>`);
})
答案 6 :(得分:1)
对于问题的前半部分,我要在这里res.type
喊一声:
res.type('json')
等同于
res.setHeader('Content-Type', 'application/json')
来源:express docs:
将Content-Type HTTP标头设置为mime.lookup()为指定类型确定的MIME类型。如果type包含“ /”字符,则它将Content-Type设置为type。
答案 7 :(得分:0)
较早版本的Express使用app.use(express.json())
或bodyParser.json()
read more about bodyParser middleware
在最新版的Express中,我们可以简单地使用res.json()
const express = require('express'),
port = process.env.port || 3000,
app = express()
app.get('/', (req, res) => res.json({key: "value"}))
app.listen(port, () => console.log(`Server start at ${port}`))
答案 8 :(得分:0)
如果您正在使用Express,则可以使用此功能:
if (spark.sparkContext.getPersistentRDDs.isEmpty) {
ts.createOrReplaceTempView(tableName)
spark.sqlContext.cacheTable(tableName)
}
或仅此
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({key:"value"}));
答案 9 :(得分:0)
您可以为此创建一个助手:设置一个助手功能,以便您可以在应用程序中的任何地方使用它
function getStandardResponse(status,message,data){
return {
status: status,
message : message,
data : data
}
}
这是我尝试获取所有主题的主题路线
router.get('/', async (req, res) => {
const topics = await Topic.find().sort('name');
return res.json(getStandardResponse(true, "", topics));
});
我们得到的答复
{
"status": true,
"message": "",
"data": [
{
"description": "sqswqswqs",
"timestamp": "2019-11-29T12:46:21.633Z",
"_id": "5de1131d8f7be5395080f7b9",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575031579309.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": "sqswqswqs",
"timestamp": "2019-11-29T12:50:35.627Z",
"_id": "5de1141bc902041b58377218",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575031835605.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": " ",
"timestamp": "2019-11-30T06:51:18.936Z",
"_id": "5de211665c3f2c26c00fe64f",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575096678917.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": "null",
"timestamp": "2019-11-30T06:51:41.060Z",
"_id": "5de2117d5c3f2c26c00fe650",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575096701051.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": "swqdwqd wwwwdwq",
"timestamp": "2019-11-30T07:05:22.398Z",
"_id": "5de214b2964be62d78358f87",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575097522372.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
},
{
"description": "swqdwqd wwwwdwq",
"timestamp": "2019-11-30T07:36:48.894Z",
"_id": "5de21c1006f2b81790276f6a",
"name": "topics test xqxq",
"thumbnail": "waterfall-or-agile-inforgraphics-thumbnail-1575099408870.jpg",
"category_id": "5de0fe0b4f76c22ebce2b70a",
"__v": 0
}
]
}