Node.js 带有角度和快速的CORS-在邮递员中工作,但不在浏览器中工作
我有一个与CORS相关的问题(我想),当我从邮递员那里发送一个登录post请求时,它成功了。当我尝试使用angular 2前端应用程序登录时,请求状态似乎为200,但什么也没有发生,在控制台中,我收到一条奇怪的消息,即不允许使用我的localhost:4200,我如何修复此问题 角度http方法Node.js 带有角度和快速的CORS-在邮递员中工作,但不在浏览器中工作,node.js,angular,express,cors,Node.js,Angular,Express,Cors,我有一个与CORS相关的问题(我想),当我从邮递员那里发送一个登录post请求时,它成功了。当我尝试使用angular 2前端应用程序登录时,请求状态似乎为200,但什么也没有发生,在控制台中,我收到一条奇怪的消息,即不允许使用我的localhost:4200,我如何修复此问题 角度http方法 authenticateUser(user){ let headers = new Headers(); headers.append('Content-Type', 'applica
authenticateUser(user){
let headers = new Headers();
headers.append('Content-Type', 'application/json');
return this.http.post('http://localhost:3000/api/authenticate', user, {headers: headers})
.map(res => res.json());
}
来自控制台的错误消息。
邮差请求(成功)
如果是与express相关的问题,以下是我的express代码:
const express = require("express")
const bodyParser = require("body-parser")
const logger = require('morgan')
const api = require("./api/api")
const path = require('path')
const secret = require('./models/secrets')
const expressJWT = require('express-jwt')
const cors = require('cors');
const app = express()
app.set("json spaces", 2)
app.use(logger("dev"))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(expressJWT({secret: secret}).unless({path : ['/api/authenticate', '/api/register']}))
app.use("/api/", api)
app.use(function (req, res, next) {
var err = new Error('Not Found')
err.status = 404
next(err)
})
app.use(function (err, req, res, next) {
console.error(err.status)
res.status(err.status || 500)
res.json({ msg: err.message, status: err.status })
})
// Body Parser middleware
app.use(bodyParser.json());
// CORS middleware
app.use(cors());
// set static folder
app.use(express.static(path.join(__dirname, 'public')));
//Call this to initialize mongoose
function initMongoose(dbConnection) {
require("./db/mongooseConnect")(dbConnection)
}
app.initMongoose = initMongoose
module.exports = app
和/authenticate的路由如下所示
// Authenticate
router.post('/authenticate', (req, res, next) => {
const username = req.body.username;
const password = req.body.password;
User.getUserByUsername(username, (err, user) => {
if (err) throw err;
if (!user) {
return res.json({ success: false, msg: 'User not found' });
}
User.comparePassword(password, user.password, (err, isMatch) => {
if (err) throw err;
if (isMatch) {
const token = jwt.sign({data: user}, secret, {
expiresIn: 604800 // 1 week
});
res.json({
success: true,
token: 'Bearer ' + token,
user: {
id: user._id,
name: user.name,
username: user.username,
email: user.email
}
});
} else {
return res.json({ success: false, msg: 'Wrong password' });
}
});
});
});
正在发出的请求称为a—您可以在错误消息中看到这一点,其中指出对飞行前请求的响应未通过访问控制检查。飞行前的请求是由浏览器发出的,因为CORS只是一种浏览器安全限制——这就是为什么它在Postman中工作的原因,当然,Postman不是浏览器 您正在使用的CORS中间件的状态如下: 要启用预飞行,必须为要支持的路线添加新的选项处理程序: 在您的情况下,由于您已将CORS处理设置为适用于所有来源等,您可以使用以下内容(同样,来自文档): 正如注释所述,您需要将其向上移动到
.js
文件的顶部,以便首先对其进行处理
还建议专门设置允许的原点、路由等,以锁定哪些原点能够访问哪些端点。你可以使用你最喜欢的搜索引擎阅读更多信息。我花了一些时间,但是找到了它,如果在
JSON.stringify(PostData)
之后发出的post请求与node app的body解析器冲突,并给出了一个空的body。谢谢!我没想过,但顺序是个问题。我移动了应用程序。使用(cors());在expressJWT中间件之前和应用程序之前。使用(“/api/”,api)。这最终解决了问题。我不需要加“*”,好吧,酷。谢谢你提供的额外信息。这里的文档有点误导,但是如果你直接转到它解释的地方,它确实建议只使用app.use(cors())
应该处理所有请求,正如你所说的。
app.options('*', cors()) // include before other routes