Как интерпретировать сообщение об ошибке узла / javascript - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь получить число, видимое в браузере на стороне клиента, используя Node.js, но Git bash выдает мне ошибку

TypeError [ERR_INVALID_ARG_TYPE]: Первый аргумент должен иметь тип string или экземпляр Buffer. Номер полученного типа (2)

Проблема здесь в том, что, как только я установил шкалу оценки для своего main2. js, консоль выдает TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer. Received type number (2). Может ли проблема быть в response.write (Asseatator.getGrade (35)); 20 баллов равняются 1-му классу, 35 баллов равняются 2-му классу и т. Д.

Вот фрагмент кода:

оценка 2. js

let _scale;
const setEvaluationScale = scale => {
  _scale = scale;
}
const simpleTest = () => { return 'Ei ollutkaan piilossa??'}
const getGrade = points => {
  let grade = 0;
  if(!_scale) {
    return 'There is no evaluation scale defined.';

  }
  for(let i = 0; i < _scale.length; i++){
    if (points >= _scale[i].points){
      grade = _scale[i].grade;
    }
  }

return grade;
}
module.exports.setEvaluationScale = setEvaluationScale;
module.exports.getGrade = getGrade;

А вот код для браузера:

main2. js

const port = 3000,
http = require("http"),
httpStatus = require("http-status-codes"),
app = http.createServer((request, response) => {
    console.log("Received an incoming request!");
    response.writeHead(httpStatus.OK, {
        "Content-Type": "text/html"
    });
    const evaluator = require('./evaluate2.js');
    evaluator.setEvaluationScale([{ grade: 1, points: 20 }, { grade: 2, points: 35 }, { grade: 3, points: 50 }, { grade: 4, points: 65 }, { grade: 5, points: 80 }]);
    response.write(evaluator.getGrade(35));
    response.end();
    console.log(`Sent a response : ${evaluator.getGrade(20)}`);
});
app.listen(port);
console.log(`The server has started and is listening on port number: ${port}`);

Фундаментальная структура main2. js из этого :

 const port = 3000,
 http = require("http"),
 httpStatus = require("http-status-codes"),
 app = http.createServer((request, response) => {
 console.log("Received an incoming request!");
 response.writeHead(httpStatus.OK, {
"Content-Type": "text/html"
 });
 let responseMessage = "<h1>Hello, Universe!</h1>";
 response.write(responseMessage);
 response.end();
 console.log(`Sent a response : ${responseMessage}`);
 });
app.listen(port);
console.log(`The server has started and is listening on port number:
➥ ${port}`);

После выполнения в Git - Bash он печатает юниверс Hello в браузере. Когда я пытаюсь использовать внешний файл с методом require / exports, он работает до тех пор, пока в браузере не будет указано значение c цифра c.

1 Ответ

1 голос
/ 01 марта 2020

Прежде всего, ни git, ни git - bash не имеют ничего общего с этой ошибкой. Вы просто используете git - bash в качестве оболочки для запуска своего nodejs кода сервера.

Во-вторых, фактическое сообщение об ошибке, включая трассировку стека (ошибка при любом ... в любом случае ) - это самый важный инструмент для поиска этой ошибки. Без трассировки стека сообщение об ошибке почти бессмысленно

В-третьих, эта строка трассировки стека идентифицирует ваш код, выдавший ошибку.

at Server.<anonymous> (C:\Users\adm\Desktop\Server\Unit1\simple_server\main2.js:13:11) 

Вы можете распознать ваш код здесь, потому что предположительно Вы знаете, main2.js это ваше. Это говорит о том, что ваш код в строке 13, позиция символа 11, вызвал ошибку. Эта строка кода находится в анонимной функции (функция без собственного имени). Подсчитав количество строк в main2.js, вы можете определить, что это неправильная строка

 response.write(responseMessage);

В-четвертых, теперь посмотрите на первую строку сообщения об ошибке

TypeError [ERR_INVALID_ARG_TYPE]: Первый аргумент должен иметь тип string или экземпляр Buffer. Полученный номер типа (2)

Ваша линия вызывает response.write() с одним аргументом. Сообщение об ошибке говорит вам, что аргумент должен быть string или каким-то другим буфером, но ваш аргумент является number.

Итак, теперь вы знаете, что ваше значение responseMessage необходимо изменить от числа до строки, прежде чем использовать его в response.write(). Как вы можете изменить это? Есть много способов. Вот два возможных варианта:

  1. Использование response.write(responseMessage.toString())

  2. Заставить вашу функцию getGrade() возвращать строку вместо числа.

Да, это сбивает с толку. Javascript должно создать иллюзию того, что строки и числа работают так же, как и все остальные. Но вы используете пакет http, который не дает вам этой иллюзии. этот пакет позволяет .write() информации отправлять в ваш браузер. Ваш браузер ожидает либо текстовую строку, либо буфер, содержащий страницу для его отображения.

Совет Pro: Используйте текстовый редактор, который показывает номера строк, поэтому вам не нужно считать их.

...