node.js - 带有webpack的节点打字稿捆绑文件找不到ejs文件
问题描述
我有一个节点项目使用 typescript 和 Webpack 编译到一个文件。我的项目结构如下:
-src
-db
-middleware
-models
-routes
-services
-validations
-views
-error
--index.css
--index.ejs
-provider
--index.css
--index.ejs
--server.ts
--webpack.config.js
--tsconfig.json
--package.json
我的 webpack.config.js 是:
const path = require('path');
const nodeExternals = require('webpack-node-externals');
const CopyPlugin = require('copy-webpack-plugin')
const {
NODE_ENV = 'production',
} = process.env;
module.exports = {
entry: './src/server.ts',
mode: NODE_ENV,
target: 'node',
watch: NODE_ENV === 'development',
output: {
path: path.resolve(__dirname, 'build'),
filename: 'index.js'
},
resolve: {
extensions: ['.ts', '.js'],
},
module: {
rules: [
{
test: /\.ts$/,
use: [
'ts-loader',
]
},
]
},
externals: [nodeExternals()],
// copy my views folder to build folder
plugins: [
new CopyPlugin([
{
from: path.join(__dirname, "src", "views"),
to: 'views',
}
])
],
}
我在这个项目中使用了 ejs 作为 itemplate 引擎。我的服务器 ts 文件是:
import express from 'express'
import path from 'path'
import bodyParser from 'body-parser'
import dotenv from 'dotenv'
dotenv.config()
const app = express()
import errorResponseHandler from './middleware/errorResponseHandler'
import routes from './routes'
import './db'
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'ejs');
app.use(express.static(path.join(__dirname, 'views')))
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json())
app.use(routes)
app.use(errorResponseHandler)
app.listen(process.env.PORT || 3000, () => {
console.log(`app listened on port ${process.env.PORT || 3000}`)
})
我的路线文件是这样的:
import express, { Request, Response, NextFunction } from 'express'
import cashBackModel from '../models/payment'
import validate, { validations } from '../validations'
const router = express.Router()
router.route('/')
.get((req: Request, res: Response, next: NextFunction) => {
res.render('providers/index', undefined, (e, html) => {
if (e) throw e;
res.send(html)
});
})
router.route('/woop/cash-back')
.get(cashBackModel.get)
.post(validate(validations.providers), cashBackModel.post)
router.route('/*')
.get((req: Request, res: Response) => {
res.render('error/index', { status: 404, message: 'Page Not Found' })
})
export default router
在开发模式下,我的应用程序运行良好,但是当我构建应用程序并运行它时,它要么找不到模块“ejs”,要么说:
TypeError [ERR_INVALID_ARG_TYPE]:“路径”参数必须是字符串类型。接收到的类型对象
我认为它找不到我的 ejs 文件。我怎么解决这个问题 ?
解决方案
推荐阅读
- ios - 在 iOS SDK 4.38.0 中 Facebook 登录有时会失败
- c# - 即使条件为真,为什么我从 sql 查询中得到空结果?
- c# - 在VS winform中更改编辑模式下控件的Z顺序
- ios - 后台线程崩溃
- c++ - C++ 匹配括号解决方案
- gnu - GNU radio Stick 是否在硬件级别具有内置的高通滤波器,还是在设计模块时实现?
- python-sphinx - 版本替换在子文档中不起作用
- java - 如何使用 Selenium 向下滚动?
- ruby-on-rails - Rails 5 - 我可以在控制台中输入 ActiveRecord 代码来检查记录吗?
- oracle - PL/SQL Developer - ORA-28041 身份验证协议内部错误