Ошибка типа [ERR_INVALID_ARG_TYPE]: аргумент «путь» должен иметь тип string Node.JS - PullRequest
1 голос
/ 28 апреля 2020

Я новичок в Node.js, и я пытаюсь разработать простое приложение mov ie api с node.js, и я создал приложение с генератором express. Я получил эту ошибку, и я не мог справиться с этим.

Во-первых, я погуглил и обнаружил github и stackoverflow, который я исследовал, но не смог решить мою проблему.

во-первых, здесь сообщение об ошибке:

TypeError [ ERR_INVALID_ARG_TYPE]: аргумент «путь» должен иметь тип string. Полученный объект типа в validateString (внутренний / валидаторы. js: 112: 11) в extname (путь. js: 1231: 5) в новом представлении (/ Users / tugrul / Projects / Learning Projects / mov ie - api / node_modules / express / lib / view. js: 56: 14) в Function.render (/ Users / tugrul / Проекты / Обучающие проекты / mov ie -api / node_modules / express / lib / application. js: 570: 12) в ServerResponse.render (/ Users / tugrul / Проекты / Учебные проекты / mov ie -api / node_modules / express / lib / response. js: 1008: 7) в / Users / tugrul / Проекты / Обучающие проекты / mov ie -api / app. js: 45: 7 at Layer.handle_error (/ Users / tugrul / Проекты / Обучающие проекты / mov ie -api / node_modules / express / lib / router /layer.js:71:5) в trim_prefix (/ Users / tugrul / Проекты / Обучающие проекты / mov ie -api / node_modules / express / lib / router / index. js: 315: 13) в / Users / tugrul / Проекты / Обучающие проекты / mov ie -api / node_modules / express / lib / router / index. js: 284: 7 в Function.process_params (/ Users / tugrul / Проекты / Обучающие проекты / mov ie -api / node_ modules / express / lib / router / index. js: 335: 12) на следующем (/ Users / tugrul / Проекты / Обучающие проекты / mov ie -api / node_modules / express / lib / router / index. js: 275: 10) в / Users / tugrul / Projects / Learning Projects / mov ie -api / app. js: 34: 3 в Layer.handle [as handle_request] (/ Users / tugrul / Projects / Learning Проекты / mov ie -api / node_modules / express / lib / router / layer. js: 95: 5) в trim_prefix (/ Users / tugrul / Проекты / Обучающие проекты / mov ie -api / node_modules / express /lib/router/index.js:317:13) в / Users / tugrul / Проекты / Обучающие проекты / mov ie -api / node_modules / express / lib / router / index. js: 284: 7 в Function.process_params (/ Users / tugrul / Projects / Learning Projects / mov ie -api / node_modules / express / lib / router / index. js: 335: 12)

здесь это мой пакет. json файл:

{
  "name": "movie-api",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "nodemon ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "jade": "~1.11.0",
    "mongoose": "^5.9.10",
    "morgan": "~1.9.1"
  }
}

и вот мое приложение. js файл:

const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');

const indexRouter = require('./routes/index');
const movieRouter = require('./routes/movie');
const directorRouter = require('./routes/director');


const app = express();

//mongodb connection

const db = require('./helper/db')();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/api/movies', movieRouter);
app.use('api/directors', directorRouter);

// catch 404 and forward to error handler
app.use((req, res, next) => {
  next(createError(404));
});

// error handler
app.use((err, req, res, next) => {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render({error:{message:err.message, code: err.code}});
});

module.exports = app;

и вот мой файл маршрутизатора директора:

const express = require('express');
const router = express.Router();
//Models

const Director = require('../models/Director');

    // Get All Movies
    router.get('/', (req, res, next) =>{
      res.json({message: 'Director APIs'});
    });


    module.exports = router;

А вот мой файл маршрутизатора mov ie:

const express = require('express');
const router = express.Router();
//Models

const Movie = require('../models/Movie');

// Get All Movies
router.get('/', (req, res) =>{
  const promise = Movie.find({ });
  promise.then((data)=>{
    res.json(data);
  }).catch((err)=>{
    res.json(err)
  });
});

//Top 10 List
router.get('/top10', (req, res) =>{
  const promise = Movie.find({ }).limit(10).sort({ imdb_score: -1});
  promise.then((data)=>{
    res.json(data);
  }).catch((err)=>{
    res.json(err)
  });
});

//Add new movie
router.post('/add-movie',(req,res,next)=>{
  //const {title,imdb_score,category,country,year} = req.body;
  const movie = new Movie(req.body);

  const promise = movie.save();

  promise.then((data)=>{
    res.json(data);
  }).catch((err)=>{
    res.json(err);
  });

});


// Get Movie From ID
router.get('/:movie_id',(req,res,next)=>{
  const promise = Movie.findById((req.params.movie_id));
  promise.then((movie)=>{

    if(!movie){
      console.log(movie);
      next({message : 'This movie can not found!', code:404});
    }else{
      res.json(movie);
    }
  }).catch((err)=>{
    res.json(err);
  });

});


//Update Movie
router.put('/:movie_id',(req,res,next)=>{
  const promise = Movie.findByIdAndUpdate(
      req.params.movie_id,
      req.body,
      {
        new: true
      });
  promise.then((movie)=>{

    if(!movie){
      console.log(movie);
      next({message : 'This movie can not found!', code:404});
    }else{
      res.json(movie);
    }
  }).catch((err)=>{
    res.json(err);
  });

});

//Delete movie
router.delete('/:movie_id',(req,res,next)=>{
  const promise = Movie.findByIdAndRemove(
      req.params.movie_id,
      req.body);
  promise.then((movie)=>{

    if(!movie){
      console.log(movie);
      next({message : 'This movie can not found!', code:404});
    }else{
      res.json({status: 1});
    }
  }).catch((err)=>{
    res.json(err);
  });

});

// get movies between two years
router.get('/between/:start_year/:end_year',(req,res,next)=>{
  const {start_year,end_year} = req.params;
  const promise = Movie.find(
      {
        // gte = ">=", lte = "<="
        year: { "$gte": parseInt(start_year), "$lte": parseInt(end_year)}
      }
  );
  promise.then((movie)=>{

    if(!movie){
      console.log(movie);
      next({message : 'This movie can not found!', code:404});
    }else{
      res.json(movie);
    }
  }).catch((err)=>{
    res.json(err);
  });

});


module.exports = router;

Когда я пытаюсь ccess http://localhost: 3000 / API / директоров Я получаю эту ошибку. Почему? Как я могу справиться с этим?

Не могли бы вы помочь мне, пожалуйста?

1 Ответ

1 голос
/ 28 апреля 2020

Проблема заключается в следующей строке:

res.render({error:{message:err.message, code: err.code}});

В соответствии с документами , render ожидает, что первым параметром будет путь к странице html оказаны. Предполагая, что в каталоге представлений есть файл с именем error, его изменение на

res.render('error', {error:{message:err.message, code: err.code}});

должно решить проблему.

Относительно второго вопроса из комментариев:

Проблема здесь в вашем промежуточном программном обеспечении:

// catch 404 and forward to error handler
app.use((req, res, next) => {
  next(createError(404));
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...