web-dev-qa-db-ja.com

NodeまたはExpressを使ってJSONを返す適切な方法

したがって、次の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を使用してサーバーからの応答でまったく同じ本文を生成する方法はありますか?明らかに、ヘッダを設定してレスポンスのcontent-typeが "application/json"になることを示すことができますが、それからオブジェクトを書いたり送ったりするにはさまざまな方法があります。私が一般的に使用されているのを見たことがある形式のコマンドを使用することによってです。

response.write(JSON.stringify(anObject));

しかし、これには2つの点があり、あたかもそれらが「問題」であるかのように論じることができます。

  • 文字列を送信しています。
  • また、最後に改行文字はありません。

もう一つの考えはコマンドを使用することです:

response.send(anObject);

これは上の最初の例と同様にcurlの出力に基づいてJSONオブジェクトを送信しているように見えます。ただし、端末上でcurlが再び使用されている場合、本文の最後には改行文字はありません。それでは、nodeまたはnode/expressを使用して最後に改行文字を追加して、このようなものを実際に書きとめるにはどうすればよいでしょうか。

353
MightyMouse

そのレスポンスも文字列です。レスポンスを整形して送信したい場合、厄介な理由で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'を実行することができます。

急行

Expressでは、 オプションを変更することでこれを実行できます

'json replacer' JSON代替コールバック、デフォルトではnull

'json spaces'フォーマット用のJSONレスポンススペース、開発時のデフォルトは2、本番時の0

実際には40に設定することはお勧めできません

app.set('json spaces', 40);

それからあなたはちょうどいくつかのJSONで応答することができます。

res.json({ a: 1 });

見やすくするために'json spaces '設定を使います。

506
bevacqua

Express.js 3x以降、レスポンスオブジェクトには、すべてのヘッダを正しく設定し、レスポンスをJSON形式で返すjson()メソッドがあります。

例:

res.json({"foo": "bar"});
345
JamieL

あなたはJSONファイルを送信しようとしている場合は、ストリームを使用することができます

var usersFilePath = path.join(__dirname, 'users.min.json');

apiRouter.get('/users', function(req, res){
    var readable = fs.createReadStream(usersFilePath);
    readable.pipe(res);
});
18
Connor Leech

あなたはそれをパイプと多くのプロセッサのうちの1つを使ってただ美しくすることができます。アプリは常にできるだけ小さな負荷で応答する必要があります。

$ curl -i -X GET http://echo.jsontest.com/key/value/anotherKey/anotherValue | underscore print

https://github.com/ddopson/underscore-cli

4
pawelzny

ミドルウェアを使用してデフォルトの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>`);
})
2
Yuci

expressを使用している場合は、これを使用できます。

res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({key:"value"}));

またはこれだけ

res.json({key:"value"});
0
IXOVER

古いバージョンのExpressはapp.use(express.json())またはbodyParser.json()bodyParserミドルウェアについてもっと読む を使います

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}`))
0
Aung Zan Baw