Nextjs -Express App.render Аргумент «путь» должен иметь тип string. Полученный тип объекта - PullRequest
0 голосов
/ 21 марта 2019

Я использую Nextjs и Express.js. Я разделяю корневую папку nextjs в папке приложения следующим образом:

app->pages->
     -_app.js
     -login.js
     -index.js

directory

Когда я добавлю это:

app.get('*', (req, res) => {
    const parsedUrl = parse(req.url,true);
    const {pathname, query = {} } = parsedUrl;
    const route = routes[pathname];

    /**
     * Pull in front end routes and check request against those routes
     * 
     */
    if(route){
        return app.render(req,res,route.page,query);
    }
     handle(req, res) // for all the react stuff
});

Я получил такую ​​ошибку:

Обратите внимание, что страницы будут компилироваться при первой их загрузке. готов в http://localhost:3000 Ошибка типа [ERR_INVALID_ARG_TYPE]: «путь» аргумент должен иметь тип string. Полученный тип объекта в assertPath (path.js: 39: 11) на extname (path.js: 835: 5) в новом представлении (D: \ WEBSITE \ MENPRO \ TRACER-STUDY-NEXTJS \ node_modules \ express \ lib \ view.js: 57: 14) в Function.render (D: \ WEBSITE \ MENPRO \ TRACER-STUDY-NEXTJS \ node_modules \ express \ lib \ application.js: 570: 12) в app.get (D: \ WEBSITE \ MENPRO \ TRACER-STUDY-NEXTJS \ server \ index.js: 77: 24)

Но когда я уберу это: return app.render(req,res,route.page,query); его работа снова.

Что происходит с этим?

полный код моего сервера :

const express = require('express');
const bodyParser = require('body-parser');
const next = require('next');
const passport = require('passport');
const session = require('express-session');
const cors = require('cors');
const cookieParser = require('cookie-parser');
const keys = require('./config/keys');
const uuidv4 = require('uuid').v4;
// const path = require('path');
// const RouteAPI = require('./modules');
const dev = process.env.NODE_ENV !== 'production';
const PORT = process.env.PORT || 3000;
const nextApp = next({ dev, dir: "./app" });
const { parse } = require('url');
const handle = nextApp.getRequestHandler()
const getRoutes = require('./routes');
const routes = getRoutes();

nextApp.prepare().then(() => {
    // express code here
    const app = express();
    app.use(session({
        genid: function (req) {
            return uuidv4() // use UUIDs for session IDs
        },
        name: keys.session.name,
        secret: keys.session.secret,
        resave: false,
        saveUninitialized: true,
        rolling: true,
        cookie: {
            secure: false,
            httpOnly: true,
            maxAge: keys.session.maxAge, // satu hari,
            sameSite: true,
        }

    }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(cookieParser());

    app.disable('x-powered-by');

    app.use(cors({ origin: keys.origin.url, credentials: true }))



    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(bodyParser.json());

    // app.use((req, res, next) => {
    //     res.header('X-XSS-Protection', '1; mode=block');
    //     res.header('X-Frame-Options', 'deny');
    //     res.header('X-Content-Type-Options', 'nosniff');
    //     res.header("Access-Control-Allow-Origin", keys.origin.url);
    //     next();
    // })


    // app.use('/api/', [
    //     RouteAPI.MahasiswaRoutes
    // ]);


    app.get('*', (req, res) => {
        const parsedUrl = parse(req.url,true);
        const {pathname, query = {} } = parsedUrl;
        const route = routes[pathname];

        /**
         * Pull in front end routes and check request against those routes
         * 
         */
        if(route){
            return app.render(req,res,route.page,query);
        }
         handle(req, res) // for all the react stuff
    });

    app.listen(PORT, err => {
        if (err) throw err;
        console.log(`ready at http://localhost:${PORT}`)
    });
})





// Server static assets if in production

Маршруты

module.exports = () =>{
    return{
        "/":{page:"/"},
        "/login":{page:"/login"},
        "/404":{page:"/404"}
    };
};

1 Ответ

0 голосов
/ 21 марта 2019

Ах да, у меня была та же проблема, и я только что нашел решение: используйте nextApp.render() вместо app.render()

    if(route){
        return nextApp.render(req,res,route.page,query);
    }
...