597 Stimmen

Richtiger Weg, JSON mithilfe von Node oder Express zurückzugeben

Also kann man versuchen, das folgende JSON-Objekt abzurufen:

$ 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"
}
$

Gibt es eine Möglichkeit, genau den gleichen Body in einer Antwort von einem Server mithilfe von node oder express zu erzeugen? Offensichtlich kann man die Header setzen und angeben, dass der Content-Type der Antwort "application/json" sein wird, aber dann gibt es unterschiedliche Möglichkeiten, das Objekt zu schreiben/senden. Die häufig verwendete Methode, die ich gesehen habe, ist die Verwendung eines Befehls der Form:

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

Allerdings gibt es zwei Punkte, bei denen man argumentieren könnte, dass es "Probleme" gibt:

  • Wir senden einen String.
  • Außerdem gibt es kein Zeilenumbruchszeichen am Ende.

Eine andere Idee ist die Verwendung des Befehls:

response.send(anObject);

Dies scheint ein JSON-Objekt zu senden, basierend auf der Ausgabe von curl ähnlich wie im ersten Beispiel oben. Allerdings gibt es kein Zeilenumbruchszeichen am Ende des Bodens, wenn curl erneut in einem Terminal verwendet wird. Wie also kann man tatsächlich etwas ähnliches mit einem Zeilenumbruchszeichen am Ende mit node oder node/express schreiben?

11voto

Nishant Punkte 191

Sie können dazu einen Helfer erstellen: Erstellen Sie eine Hilfsfunktion, sodass Sie sie überall in Ihrer Anwendung verwenden können

function getStandardResponse(status, message, data){
    return {
        status: status,
        message : message,
        data : data
     }
}

Hier ist meine Themenroute, auf der ich versuche, alle Themen zu erhalten

router.get('/', async (req, res) => {
    const topics = await Topic.find().sort('name');
    return res.json(getStandardResponse(true, "", topics));
});

Die Antwort, die wir erhalten

{
"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
    }
      ]
}

9voto

MalcolmOcean Punkte 2665

Für den Header-Teil der Frage gebe Ich jetzt res.type einen Shout-out:

res.type('json')

ist äquivalent zu

res.setHeader('Content-Type', 'application/json')

Quelle: express docs:

Setzt den Content-Type HTTP-Header auf den MIME-Typ, wie von mime.lookup() für den angegebenen Typ bestimmt. Wenn der Typ das "/"-Zeichen enthält, wird der Content-Type auf den Typ gesetzt.

5voto

pawelzny Punkte 51

Sie können es einfach mit einem Pipe und einem der vielen Prozessoren verschönern. Ihre App sollte immer mit so geringer Last wie möglich antworten.

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

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

5voto

Yuci Punkte 22138

Sie können ein Middleware verwenden, um den standardmäßigen Content-Type festzulegen und den Content-Type für bestimmte APIs unterschiedlich festzulegen. Hier ist ein Beispiel:

const express = require('express');
const app = express();

const port = process.env.PORT || 3000;

const server = app.listen(port);

server.timeout = 1000 * 60 * 10; // 10 Minuten

// Verwenden Sie Middleware, um den standardmäßigen Content-Type festzulegen
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) => {
    // Setzen Sie den Content-Type für diese spezielle API unterschiedlich fest
    res.set({'Content-Type': 'application/xml'});
    res.send(`
        Tove
        Jani
        Reminder
        Vergiss mich dieses Wochenende nicht!
        `);
})

2voto

Aung Zan Baw Punkte 344

Ältere Versionen von Express verwenden app.use(express.json()) oder bodyParser.json() mehr über den bodyParser Middleware lesen

In der neuesten Version von Express können wir einfach res.json() verwenden

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}`))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X