Я пытаюсь получить содержимое файла .json с помощью службы узла js в метод angularjs. Но я получаю следующую ошибку:

_http_outgoing.js: 700 throw new ERR_INVALID_ARG_TYPE ('chunk', ['string', 'Buffer'], chunk); ^ TypeError [ERR_INVALID_ARG_TYPE]: аргумент "chunk" должен иметь тип string или Buffer. Полученный объект типа на ServerResponse.end (_http_outgoing.js: 700: 13)

Вот соответствующие фрагменты кода ...

угловой контроллер : все закомментированные строки - те, с которыми я пробовал и потерпел неудачу.

var currentProcess = "process_1cA";
$scope.storestats = [];
var resAss = $resource('/procs/getstorestats');
var stats = resAss.get({
  process: currentProcess,
  date: date.getFullYear() + "" + m + "" + d
});
stats.$promise.then(function(response) {
  if (response != undefined) {
    //    var r = JSON.parse(response);
    //$scope.storestats.push(r);
    //$scope.storestats.push(r);

    //var r = JSON.parse(response);
    $scope.storestats.push(response);
    //angular.forEach(r, function(value, key) {
    //    $scope.storestats.push({key : value});
    //});
  }
});

Служба NODEJs:

httpApp.get('/procs/getstorestats', function(req, res, next) {

try {
    fs.readFile(cfg.routestatspath + "storestats-"+req.query.process + "-" + req.query.date + ".json", function (err, data) {
        var msgs1 = JSON.parse(data);
        //var r  = data.toString('utf8');
        var msgs2 = JSON.stringify(msgs1);
        console.log(msgs1);
        res.end(msgs1);
    });
}
catch (err) {
    res.end(err.toString());
}});

P.S: Закомментированные строки - те, с которыми я пробовал и потерпел неудачу. Кроме того, закомментированные строки в фрагменте кода службы узла не дают ошибок, и при регистрации они отображаются правильно, но данные при ответе контроллеров пустые.

4
Rai 20 Авг 2018 в 13:43

5 ответов

Лучший ответ

Догадаться. Потребовалось 2 небольших изменения. Один в контроллере, который должен был использовать «$ resource.query» вместо «$ resource.get». А в сервисе, как сказал @jakarella, пришлось использовать строковую часть в .end ();

Контроллер:

                var resAss = $resource('/procs/getstorestats');
                var stats =  resAss.query({process: currentProcess, date: date.getFullYear() + "" + m + "" + d});
                stats.$promise.then(function (response) {
                    $scope.storestats.push(response);
                }

Узел Сервис:

httpApp.get('/procs/getstorestats', function(req, res, next) {

try {
    fs.readFile(cfg.routestatspath + "storestats-"+req.query.process + "-" + req.query.date + ".json", function (err, data) {
        var msgs1 = JSON.parse(data);
        var msgs2 = JSON.stringify(msgs1);
        console.log(msgs2);
        res.end(msgs2);
    });
}
0
Rai 21 Авг 2018 в 04:34

Я предполагаю немного здесь, но я думаю, что вам просто нужно изменить res.end() на res.send() в вашем коде Node. Метод end используется при потоковой передаче фрагментов данных, а затем вы вызываете end(), когда все готово. Метод «send» предназначен для отправки ответа за один раз и позволяет Node обрабатывать потоковую передачу.

Также убедитесь, что вы отправляете строку назад!

httpApp.get('/procs/getstorestats', function(req, res, next) {

  try {
    fs.readFile(cfg.routestatspath + "storestats-"+req.query.process + "-" + req.query.date + ".json", function (err, data) {
        var msgs1 = JSON.parse(data);
        //var r  = data.toString('utf8');
        var msgs2 = JSON.stringify(msgs1);
        console.log(msgs1);
        res.send(msgs2);  // NOTE THE CHANGE to `msg2` (the string version)
    });
  }
  catch (err) {
    res.send(err.toString());  // NOTE THE CHANGE
  }
});
7
Jordan Kasper 20 Авг 2018 в 11:50

У меня была похожая ошибка. Это было потому, что я передавал process.pid в res.end (). Это сработало, когда я изменил process.pid на string

res.end(process.pid.toString());
2
user6184932user6184932 29 Окт 2019 в 11:27

Если вы используете библиотеку «запрос-обещание», установите json

var options = {
    uri: 'https://api.github.com/user/repos',
    qs: {
        access_token: 'xxxxx xxxxx' 
    },
    headers: {
        'User-Agent': 'Request-Promise'
    },
    json: true // Automatically parses the JSON string in the response
};

rp(options)
    .then(function (repos) {

    })
    .catch(function (err) {

    });
0
chenchunaidu 2 Дек 2019 в 07:51

Спасибо user6184932, все работает

try {
    await insertNewDocument(fileNameDB, taskId);
    res.end(process.pid.toString());
} catch (error) {
    console.log("error ocurred", error);
    res.send({
        "code": 400,
        "failed": "error ocurred"
    })
}
0
Янов Алексей 14 Янв 2020 в 11:14
51929027