Анализ данных формы в веб-приложении Azure - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть небольшое тестирование веб-приложения 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.

Если у вас есть идеи, почему это не работает на лазурном, пожалуйста, дайте мне знать.

Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2018

Убедитесь, что вы использовали заявление app.use(bodyParser.json()); чтобы ваши данные json распознавались bodyParser.

Без этого я получаю тот же пустой результат {}, что и ваш.

BodyParser не может определить формат входящего тела, если мы не укажем его.

...