的Node.js +快递+ CORS不工作:待定选择请求

问题描述:

我试着约10个不同的选择,但我不能让我的POST请求启动,而不是工作,我有一个未完成的方案要求并无法完成的Node.js +快递+ CORS不工作:待定选择请求

server.js

var express = require('express'); 
var path = require('path'); 
var mongoose = require('mongoose'); 
var bodyParser = require('body-parser'); 
var cors = require('cors'); 

var app = express(); 

app.use(cors()); 

var allowCrossDomain = function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With, Accept'); 

    // intercept OPTIONS method 
    if ('OPTIONS' == req.method) { 
     res.send(200); 
    } else { 
     next(); 
    } 
}; 
app.use(allowCrossDomain); 

app.options('*', cors()); 

app.use(require('./routes/order-templates.js')); 
app.use(require('./routes/statuses.js')); 
app.use(require('./routes/fields.js')); 
app.use(require('./routes/users.js')); 
app.use(require('./routes/groups.js')); 
app.use(require('./routes/upload.js')); 
app.use(require('./routes/feedback.js')); 

app.use(require('./routes/order.js')); 

app.use(express.static('public')); 

var mongoDB = 'mongodb://localhost/ior'; 

mongoose.connect(mongoDB, { 
    useMongoClient: true 
}); 

app.get('*', function (request, response) { 
    response.sendFile(path.resolve(__dirname, 'public', 'index.html')) 
}) 

app.listen(3000, function() { 
    console.log('Fired at ' + Date()); 
}); 

users.js

var express = require('express'); 
var router = express.Router(); 

var User = require('../model/user.js'); 
var bodyParser = require('body-parser'); 

var app = express(); 

var cors = require('cors') 

var corsOptions = { 
    origin: 'http://188.225.82.166:3000/', 
    optionsSuccessStatus: 200 
} 

app.use(cors()) 
app.use(bodyParser.json()); 

app.options('/users/auth/', cors(corsOptions)) 
app.post('/users/auth/', cors(), function (req, res, next) { 
    User.findOne({"mail": req.body.mail, "password": req.body.password}, function (err, user) { 
     if (err) throw err; 
     if (user == undefined) { 
      res.send({"result": "error" }) 
      res.sendStatus(200) 
     } else { 
      res.send({"result": "ok", "_id": user._id, "type": user.type }) 
     } 
    }); 
}) 

module.exports = app 

如果我做

app.use(cors()); 

app.use(function(req, res, next) { 
    console.log('After CORS ' + req.method + ' ' + req.url); 
    next(); 
}); 

server.js我得到

After CORS GET/
After CORS GET /bundle.js 
After CORS GET /bootstrap.css.map 
After CORS GET /favicon.ico 

并没有什么打印控制台POST请求后启动。 还值得一提的是,只有当我使用ubuntu部署到服务器时,问题才存在。在Mac OS机器上本地一切都很好

+0

我看不到任何OPTIONS请求挂起的原因。 'app.use(cors())'这一行应该已经足够了,你应该能够摆脱所有其他与CORS相关的代码。如果您将'server.js'的顶部更改为此https://jsfiddle.net/fjL7oejo/,则应该记录一下以查看发生了什么。 OPTIONS请求应该只触发日志的第一个位,其他请求应该同时触发。如果您仍然无法弄清楚问题所在,可能会有助于向我们确切地告诉我们在失败时要做什么。 – skirtle

+0

用记录详细信息和一些其他信息更新了该帖子 –

试试这个。在你的user.js文件中使用router.post而不是app.post。

router.post('/users/auth/', cors(), function (req, res, next) { 
    User.findOne({"mail": req.body.mail, "password": req.body.password}, function (err, user) { 
     if (err) throw err; 
     if (user == undefined) { 
      res.send({"result": "error" }) 
      res.sendStatus(200) 
     } else { 
      res.send({"result": "ok", "_id": user._id, "type": user.type }) 
     } 
    }); 
}) 

然后出口路由器模块

module.exports = router; 

此外,我建议在server.js文件中使用bodyparser。所以你不需要在每个文件中使用它。

您应该在bodyParser之前使用cors,并允许它也用于PUT/DELETE。

// Add cors 
app.use(cors()); 
app.options('*', cors()); // enable pre-flight 
app.use(bodyParser.json());