У меня есть небольшое тестирование веб-приложения nodejs на Azure, которое использует базу данных Azure Cosmos db для вставки и извлечения данных. В основе веб-приложения лежат экспресс-фреймворк, mongoose (для взаимодействия с базой данных), pug для шаблонов и body-parser для анализа данных, отправляемых веб-формой.
Проблема, с которой я столкнулся, заключается в том, что я не могу получить доступ к данным, отправленным через веб-форму, на основании которых я хочу вставить новый документ в базу данных Azure Cosmos db. Обычно, когда я отправляю веб-форму, приложение должно получить доступ к данным формы (с помощью модуля body-parser ), создать новый документ в базе данных и обновить представление (которое будет содержать информацию из вновь созданный документ).
Ниже приведен код этого небольшого приложения.
const express = require('express');
const http = require('http');
const mongoose= require('mongoose');
const bodyParser = require('body-parser');
const app = express();
var port = process.env.PORT || 5050; //normalizePort(process.env.PORT || '5050');
app.set('port', port);
app.set('views', 'views');
app.set('view engine', 'pug');
mongoose.connect(`mongodb://[user].documents.azure.com:10255/testdb?ssl=true`, {
auth: {
user: `[username]`,
password: `[password]`
}
})
.then(() => console.log('connection successful'))
.catch((err) => console.error(err));
let citySchema = new mongoose.Schema ({
id: {type: String, required: true},
name: {type: String, required: true},
country: {type: String, required: true}
});
const Cities = mongoose.model('Cities', citySchema);
let getData = function(request, response) {
Cities.find({}, function(err, data) {
if (err) { return "There was an error";}
console.log(JSON.stringify(data));
response.render('index', {
panelTitle: "Azure CosmosDB Test",
panelBody:"Testing how to access Azure ComsosDB",
cities: data
});
});
};
let urlencoded = bodyParser.urlencoded({extended: false});
app.get('/', function(request, response) {
getData(request, response);
});
app.get('/error', function(request, response) {
response.render('error');
})
app.post('/', urlencoded, function(request, response){
console.log(request.body);
let newCity = new Cities({id: request.body.id, name: request.body.name,
country: request.body.country});
console.log(newCity);
newCity.save(function(err, savedCity){
console.log(JSON.stringify(savedCity));
});
response.redirect('back');
});
app.use(express.static(__dirname + '/public'));
const server = http.createServer(app);
server.listen(port);
На localhost код работает просто отлично, он вставляет новый документ в базу данных, а затем в обновленном виде новый город появляется в списке (генерируется на основе файла pug).
Однако на Azure ничего не произошло. Представление обновляется, но новый документ не создается, и, конечно, представление не содержит информации, отправляемой веб-формой. Это не проблема с подключением к базе данных, потому что приложение может извлекать информацию для создания списка городов. Кроме того, если в маршруте post , когда я создаю новый город и пытаюсь сохранить его, я использую прямые значения, подобные этому:
let newCity = new Cities({id: 'MUN", name: "Munich",
country: "Germany"});
документ создается и сохраняется в базе данных azure cosmos db, а представление содержит новые данные.
Мне кажется, что req.body пусто и данные формы не анализируются, хотя я в этом отношении использую модуль body-parser . В браузере на инструментах разработчика - вкладка сеть - отображается форма данных, отправляемых на сервер, и у меня есть код состояния 302.
Если у вас есть идеи, почему это не работает на лазурном, пожалуйста, дайте мне знать.
Спасибо!