我正在构建Node Web应用程序。这是我的问题:
我的app.js文件中已安装了路由,其中包括以下两个路由。作为参考,这是一个快速应用。
app.use('/',viewRouter);
app.use('/api/v1/users',userRouter);
来自app.js的userRouter转到具有以下内容的userRoutes.js文件。 userController有一个导出的函数,称为updateMyProfile。
router.patch(
'/updateMyProfile',userController.updateMyProfile
);
userController函数在下面。作为参考,“ catchAsync”只是一个函数,当一个函数发生时将引发错误。 “ AppError”仅用于将错误发送给客户端。
exports.updateMyProfile = catchAsync(async (req,res,next) => {
if (req.body.password || req.body.passwordConfirm) {
return next(
new AppError(
'This route is not for password updates. Please use /updateMyPassword.',400
)
);
}
const filteredBody = filterObj(req.body,'firstName','email');
if (req.file) filteredBody.photo = req.file.filename;
const updatedUser = await User.findByIdAndUpdate(req.user.id,filteredBody,{
new: true,runValidators: true
});
res.status(200).json({
status: 'success',data: {
user: updatedUser
}
});
});
大部分代码来自我在Udemy上的NodeJS课程。当我在这里使用它时,此代码可以正常工作。现在,我正在尝试为新的Web应用程序量身定制代码,一切都变得一团糟。
我正在使用Postman验证并测试API在客户端和MongoDB之间是否正常工作。路由/ api / v1 / users / updateMyProfile /上的邮递员示例,发送此JSON ...
{
"firstName": "Jared1"
}
产生一条成功消息,并实际上显示字段“ firstName”已更新:
{
"status": "success","data": {
"user": {
"profileAvatar": "default-avatar.jpg","appUserRole": "customer-individual","accountStatus": "active","time_zone_abbreviation": [],"_id": "5dcf221d3d5b28218539c73c","firstName": "Jared1","lastName": "Ledbetter","email": "jared@carbondigital.us","phone": "123-123-1234","companyTitle": "Chief Executive Officer","addressState": "PA","addressCountry": "United States","__v": 0
}
}
}
在确认API正常工作后,我开始在页面上使用此功能。我在前端使用PUG。以下是此配置文件更新所用表格的摘录。
注意:每个字段都有一个if函数,该函数检查该字段是否具有值,并输出该值或显示为空白。 (这样做是因为否则会显示“未定义”。)
form.form-horizontal.form-bordered.form-update-account
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2(for='firstName') account Status
.col-lg-6
-if (user.accountStatus === 'active')
input#accountStatus.form-control(type='text' value='active' readonly='readonly')
-if (user.accountStatus === 'inactive')
input#accountStatus.form-control(type='text' value='Inactive' readonly='readonly')
-if (user.accountStatus === 'on-hold')
input#accountStatus.form-control(type='text' value='On Hold' readonly='readonly')
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2(for='firstName') Title
.col-lg-6
- if (user.companyTitle)
input#companyTitle.form-control(type='text' value=`${user.companyTitle}`)
- if (!user.companyTitle)
input#companyTitle.form-control(type='text' value='')
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2(for='firstName') First Name
.col-lg-6
input#firstName.form-control(type='text' value=`${user.firstName}`)
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2(for='lastName') Last Name
.col-lg-6
input#lastName.form-control(type='text' value=`${user.lastName}`)
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2(for='emailaddress') Email
.col-lg-6
input#emailaddress.form-control(type='text' value=`${user.email}`)
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2(for='phoneNumber') Phone
.col-lg-6
- if (user.phoneNumber)
input#phoneNumber.form-control(type='text' value=`${user.phone}`)
- if (!user.phoneNumber)
input#phoneNumber.form-control(type='text' value='')
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2(for='addressCity') City
.col-lg-6
- if (user.addressCity)
input#addressCity.form-control(type='text' value=`${user.addressCity}`)
- if (!user.addressCity)
input#addressCity.form-control(type='text' value='')
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2 State
.col-lg-6
select#addressState.form-control.populate(data-plugin-selecttwo='' value='')
- if (user.addressState)
option(value=`${user.addressState}`)
- if (!user.addressState)
option(value='') No State Selected
option(value='AL') Alabama
option(value='AK') Alaska
option(value='AZ') Arizona
option(value='AR') Arkansas
option(value='CA') California
option(value='CO') Colorado
option(value='CT') Connecticut
option(value='DE') Delaware
option(value='FL') Florida
option(value='GA') Georgia
option(value='HI') Hawaii
option(value='ID') Idaho
option(value='IL') Illinois
option(value='IN') Indiana
option(value='IA') Iowa
option(value='KS') Kansas
option(value='KY') Kentucky
option(value='LA') Louisiana
option(value='ME') Maine
option(value='MD') Maryland
option(value='MA') Massachusetts
option(value='MI') Michigan
option(value='MN') Minnesota
option(value='MS') Mississippi
option(value='MO') Missouri
option(value='MT') Montana
option(value='NE') Nebraska
option(value='NH') New Hampshire
option(value='NJ') New Jersey
option(value='nm') New Mexico
option(value='NY') New York
option(value='NV') Nevada
option(value='NC') North Carolina
option(value='ND') North Dakota
option(value='OH') Ohio
option(value='OK') Oklahoma
option(value='OR') Oregon
option(value='PA') Pennsylvania
option(value='RI') Rhode Island
option(value='SC') South Carolina
option(value='SD') South Dakota
option(value='TX') Texas
option(value='TN') Tennessee
option(value='UT') Utah
option(value='VT') Vermont
option(value='VA') Virginia
option(value='WA') Washington
option(value='WI') Wisconsin
option(value='WY') Wyoming
option(value='WV') West Virginia
option(value='WI') Wisconsin
option(value='WY') Wyoming
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2(for='addressCountry') Country
.col-lg-6
input#addressCountry.form-control(type='text' value=`${user.addressCountry}`)
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2 Upload Profile Photo
.col-lg-6
.fileupload.fileupload-new(data-provides='fileupload')
.input-append
.uneditable-input
i.fas.fa-file.fileupload-exists
span.fileupload-preview
span.btn.btn-default.btn-file
span.fileupload-exists Change
span.fileupload-new Select file
input#profileAvatar(type='file')
a.btn.btn-default.fileupload-exists(href='#' data-dismiss='fileupload') Remove
.form-group.row
label.col-lg-3.control-label.text-lg-right.pt-2 Email Signature
.col-lg-9
.summernote(rows='10' data-plugin-summernote='' data-plugin-options='{ "height": 180,"codemirror": { "theme": "ambiance" } }')
p Placeholder
.form-row
.col-md-12.text-right.mt-3
button.btn.btn-primary.modal-confirm Save
好的,所有这些都涵盖了应用程序的后端。在前端,我有一个名为updateSettings.js的文件,其中还具有一个名为updateSettings的函数。
/* eslint-disable */
import axios from 'axios';
import { showAlert } from './alerts';
// Type is either 'password' or 'data' (data = name & email)
export const updateSettings = async (data,type) => {
try {
const url =
type === 'password'
? '/api/v1/users/updateMyPassword'
: '/api/v1/users/updateMyProfile';
const res = await axios({
method: 'PATCH',url,data
});
if (res.data.status === 'success') {
showAlert('success',`${type.toUpperCase()} updated successfully!`);
// window.setTimeout(() => {
// location.assign('/me');
// },100);
}
} catch (err) {
showAlert('error',err.response.data.message);
}
};
那个updateSettings.js文件被导入到我的index.js文件中,这就是魔术发生的地方。我只包含了相关的代码行。
import { updateSettings } from './updateSettings';
const userDataForm = document.querySelector('.form-update-account');
if (userDataForm)
userDataForm.addEventListener('submit',e => {
e.preventDefault();
const form = new FormData();
form.append('firstName',document.querySelector('#firstName').value);
form.append('email',document.querySelector('#emailaddress').value);
updateSettings(form,'data');
});
因此,当我在浏览器中单击保存按钮(PUG文件)时,会发生一些事情。
- 该页面将重新加载与数据库中完全相同的信息。表示未上传数据库。我对此进行了验证,并且还验证了这不是缓存问题。
- 以下URL参数已添加到我的URL中。 “?files =”
- 我收到以下控制台消息。
GET /my-account?files= 304 332.887 ms - -
Error: Can't find /vendor/bootstrap-markdown/js/markdown.js on this server!
at app.all (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/app.js:119:8)
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/layer.js:95:5)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:137:13)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at Route.dispatch (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/layer.js:95:5)
at /Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:281:22
at param (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:354:14)
at param (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:365:14)
at Function.process_params (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:410:3)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:275:10)
Error: Can't find /vendor/bootstrap-markdown/js/to-markdown.js on this server!
at app.all (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/app.js:119:8)
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/layer.js:95:5)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:137:13)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at Route.dispatch (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/layer.js:95:5)
at /Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:281:22
at param (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:354:14)
at param (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:365:14)
at Function.process_params (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:410:3)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:275:10)
GET /vendor/bootstrap-markdown/js/markdown.js 404 1.382 ms - -
GET /vendor/bootstrap-markdown/js/to-markdown.js 404 1.207 ms - -
Error: Can't find /vendor/bootstrap-markdown/js/markdown.js on this server!
at app.all (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/app.js:119:8)
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/layer.js:95:5)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:137:13)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at Route.dispatch (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/layer.js:95:5)
at /Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:281:22
at param (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:354:14)
at param (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:365:14)
at Function.process_params (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:410:3)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:275:10)
GET /vendor/bootstrap-markdown/js/markdown.js 404 0.359 ms - -
Error: Can't find /vendor/bootstrap-markdown/js/to-markdown.js on this server!
at app.all (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/app.js:119:8)
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/layer.js:95:5)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:137:13)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:131:14)
at Route.dispatch (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/layer.js:95:5)
at /Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:281:22
at param (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:354:14)
at param (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:365:14)
at Function.process_params (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:410:3)
at next (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/node_modules/express/lib/router/index.js:275:10)
GET /vendor/bootstrap-markdown/js/to-markdown.js 404 0.528 ms - -
看到这里,我收到几个对我来说没有多大意义的GET请求。我知道我应该在控制台中记录这些内容,但我不知道为什么要记录这些内容。从完整的控制台日志中,我删除了除GET请求之外的所有内容。
GET /my-account?files= 304 332.887 ms - -
GET /vendor/bootstrap-markdown/js/markdown.js 404 1.382 ms - -
GET /vendor/bootstrap-markdown/js/to-markdown.js 404 1.207 ms - -
GET /vendor/bootstrap-markdown/js/markdown.js 404 0.359 ms - -
GET /vendor/bootstrap-markdown/js/to-markdown.js 404 0.528 ms - -
然后,每个这些GET请求都导致一个错误。我已从错误中删除了节点模块路径。
Error: Can't find /vendor/bootstrap-markdown/js/markdown.js on this server!
at app.all (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/app.js:119:8)
Error: Can't find /vendor/bootstrap-markdown/js/to-markdown.js on this server!
at app.all (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/app.js:119:8)
Error: Can't find /vendor/bootstrap-markdown/js/markdown.js on this server!
at app.all (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/app.js:119:8)
Error: Can't find /vendor/bootstrap-markdown/js/to-markdown.js on this server!
at app.all (/Applications/MAMP/htdocs/Carbon_Digital/Carbon_Builder/carbon-builder-private/app.js:119:8)
自然,我将从此记录的控制台语句中做两件事。
-
我检查了GET请求中引用的路径,并且存在两个bootstrap-markdown文件。因此,我不知道为什么我对存在的文件会出错。
-
我在119行检查了app.js文件,以下功能涵盖了118-120行。
app.all('*',(req,next) => {
next(new AppError(`Can't find ${req.originalUrl} on this server!`,404));
});
牢记所有这些,是否有人对这里发生的事情有所了解?保存按钮不应创建GET请求。另外,对于存在的文件也不应有错误。我只是在尝试更新用户的个人资料信息,无法找出问题所在。
旁注。由于该项目的性质,我无权共享整个GitHub存储库。