gpt4 book ai didi

javascript - 不允许在本地 Nodejs 服务器中进行跨域请求

转载 作者:行者123 更新时间:2023-11-30 11:29:16 26 4
gpt4 key购买 nike

我在 nodejs 中创建了一个本地 REST API 服务器,它从本地 Mongodb 数据库中获取数据。我还创建了一个基本网页,从本地服务器请求此数据。现在,当我尝试从网页获取数据时,出现以下错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:4000/todos. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

我在 stackoverflow 上搜索了一下,找到了 THISTHIS解决方案。我已经在我的主 app.js 文件中添加了建议的 header 。但它仍然给出相同的错误。

以下是我的服务器 app.js 文件,我在其中添加了这些 header 。

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');
var todos = require('./routes/todos');

// load mongoose package
var mongoose = require('mongoose');

// Use native Node promises
mongoose.Promise = global.Promise;

// connect to MongoDB
mongoose.connect('mongodb://localhost/todo-api')
.then(() => console.log('connection succesful'))
.catch((err) => console.error(err));

var app = express();

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

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);
app.use('/todos', todos);

// Add headers
app.use(function (req, res, next) {

// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', '*');

// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

// Request headers you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader('Access-Control-Allow-Credentials', true);

// Pass to next layer of middleware
next();
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});

module.exports = app;

下面是网页的代码(Angularjs),我想从我的 API 获取数据。

dbConnection.html

<html ng-app="demo">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"> </script>
<head>
<title> dbConnection Demo</title>
</head>

<body ng-controller="db">
<div ng-repeat="product in db.products">
{{product._id}} </br>
</div>
</body>

<script>
var app = angular.module('demo', []);
app.controller('db', ['$http', function($http){
var store = this;
store.products = [];

$http({
method: 'GET',
url: 'http://localhost:4000/todos'
}).then(function (success){
store.products = success;
},function (error){

});
}]);
</script>
</html>

即使我按照答案中的建议添加了 header ,我仍会遇到同样的错误。我在这里错过了什么?我在这个领域完全是新手。谢谢!

最佳答案

您的请求是否需要飞行前响应?如果是这样,它将尝试使用方法“OPTIONS”访问您的端点,除非您设置了一个,否则您将看到 cors 问题。

因此,如果您发现预检响应失败,您可以添加自定义选项路由,或者可能使用 npm cors 包 - https://www.npmjs.com/package/cors

npm install cors --save

在你的 app.js 中

var cors = require('cors')


app.options('*', cors()) // include before other routes
app.use(cors())

关于javascript - 不允许在本地 Nodejs 服务器中进行跨域请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46846621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com