.push() не сохраняется в моем массиве — NodeJS

#node.js

Вопрос:

Я пытаюсь закодировать веб-сервер в простых NodeJS с помощью http. То, что я пытаюсь сделать, — это когда у вас есть URL /добавить/, что бы ни было после того, как /добавить/ будет добавлено в массив, и отображается на/, но массив не сохраняется, и сбрасывает его, когда я добавляю что-то новое. Может кто-нибудь объяснить, что я сделал не так?

Извините, что мой код немного запутан.

Index.js:

 const http = require('http');
const $conf = require('./config.json');

http.createServer((req, res) => {

    let $list = [];

    const url = req.url;
    const $req = url.split('/');
    const $req_q = url.split('?');

    if (req.url == "/"){
        res.write($list.toString());
    } else if (req.url == `/add/${$req[2]}`){

        $list.push($req[2])
        console.log($list)
        res.write(`ADDED ${$req[2]}`)

    } else {
        res.write('Error');
    }
    res.end();
}).listen($conf.port);
 

Конфигурация.json:

 {
    "port": 80
}
 

Когда я получаю /добавляю/привет
, я получаю «ДОБАВЛЕНО привет».

Затем вернитесь в / и ничего не получите.

Комментарии:

1. Консоль. войдите в else if блок, выводится ли он на консоль?

Ответ №1:

Веб-сервер NodeJS выполняет маршрут (например '/' , или '/add' ) по требованию. Это означает, что все внутри функции выполняется с нуля по каждому запросу.

Поэтому ваша $list переменная инициализируется каждый раз, когда вы вызываете маршрут, и вы не можете видеть результат на экране.

Вы можете исправить это, переместив переменную в глобальную область.

 const http = require('http');
const $conf = require('./config.json');

let $list = []; // Now this value is persisted between requests

http.createServer((req, res) => {
    const url = req.url;
    const $req = url.split('/');
    const $req_q = url.split('?');

    if (req.url == "/"){
        res.write($list.toString());
    } else if (req.url == `/add/${$req[2]}`){

        $list.push($req[2])
        console.log($list)
        res.write(`ADDED ${$req[2]}`)

    } else {
        res.write('Error');
    }
    res.end();
}).listen($conf.port);
 

Комментарии:

1. Я не уверен, будет ли это очевидно или нет для OP, но, по крайней мере, было бы полезно указать, что это $list разделяется между всеми клиентами, получающими доступ к веб-серверу, и не является отдельным для каждого клиента.

Ответ №2:

Основная причина заключается в том, что массив $list инициализируется каждый раз при поступлении нового запроса. Таким образом, на данный момент может быть два способа сделать это.

  1. Создайте переменную за пределами этой области маршрута, чтобы вы могли получить доступ к предыдущему значению. (эта переменная будет общей для каждого запроса/клиента)
  2. Другим и более эффективным способом является более эффективное хранение значения с помощью node-json-db, так как могут быть тысячи запросов, для которых вам может потребоваться сохранить эти данные, и в это время это будет неэффективно. Вы можете использовать node-json-db.

Пример кода:

 import { JsonDB } from 'node-json-db';
import { Config } from 'node-json-db/dist/lib/JsonDBConfig'

// The first argument is the database filename. If no extension, '.json' is assumed and automatically added.
// The second argument is used to tell the DB to save after each push
// If you put false, you'll have to call the save() method.
// The third argument is to ask JsonDB to save the database in an human readable format. (default false)
// The last argument is the separator. By default it's slash (/)
var db = new JsonDB(new Config("myDataBase", true, false, '/'));

// Pushing the data into the database
// With the wanted DataPath
// By default the push will override the old value
db.push("/test1","super test");

// Get the data from the root
var data = db.getData("/");

// From a particular DataPath
var data = db.getData("/test1");

// If you try to get some data from a DataPath that doesn't exists
// You'll get an Error
try {
    var data = db.getData("/test1/test/dont/work");
} catch(error) {
    // The error will tell you where the DataPath stopped. In this case test1
    // Since /test1/test does't exist.
    console.error(error);
};

 

Есть несколько других операций, которые вы можете выполнить, для этого вам следует проверить его документацию.