2017-10-14 51 views
0

我試着約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

用記錄詳細信息和一些其他信息更新了該帖子 –

回答

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。所以你不需要在每個文件中使用它。

1

您應該在bodyParser之前使用cors,並允許它也用於PUT/DELETE。

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