У меня проблема с получением информации о фильме при отправке GET запрос к omdbapi.com.

Вот код, который обрабатывает POST запрос к моей базе данных:

const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

const Movie = require('../models/movie');

router.post('/', (req, res, next) => {

    var temp;
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(){
        if (this.readyState == 4 && this.status == 200) {
            temp = JSON.parse(this.responseText);
        }
    };
    xhr.open("GET", "http://www.omdbapi.com/?t=" + req.body.title + "&apikey=xyz", true);
    xhr.send();

    const movie = new Movie({
            _id: new mongoose.Types.ObjectId(),
            title: req.body.title,
            movieInfo: temp,
            comment: req.body.comment
    });

    movie
    .save()
    .then(result => {
        console.log(result);
        res.status(201).json({
            message: 'Created movie succesfully',
            createdMovie: {
                _id: movie._id,
                title: movie.title,
                movieInfo: movie.movieInfo,
                comment: movie.comment
            }
        });
    })
    .catch(err => {
        console.log(err);
        res.status(500).json({
            error : err
        });
    });
});

module.exports = router;

Моя проблема здесь в том, что все передается, кроме movieInfo, который я хочу быть вложенным объектом JSON, например,

createdMovie{
 ...
 movieInfo: {
  Title: a,
  Actors: b,
  ...
  ...
 }
 ...
}

Вот схема мангуста, над которой я работаю

const mongoose = require('mongoose');

const movieSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    title: String,
    movieInfo: String,
    comment: String
});

module.exports = mongoose.model('Movie', movieSchema);

Когда я POST фильм, это то, что я получаю при тестировании (я использую Почтальон для целей тестирования).

{
    "message": "Created movie succesfully",
    "createdMovie": {
        "_id": "5b7b0da48f5fb04e3c0f740b",
        "title": "Goodfellas",
        "comment": "some comment"
    }
}

Так что мне не хватает movieInfo, и я не знаю, произошло ли это потому, что оно даже не дошло до объекта, потому что я пропустил его неправильно или просто не отображается. Пробовал с разными типами мангустов, такими как String, Array, Mixed, но ни один из них не работал.

JSON, который вы получаете, если запрос был успешным, выглядит так

{
    "Title":"Goodfellas",
    "Year":"1990",
    "Rated":"R",
    "Released":"21 Sep 1990",
    "Runtime":"146 min",
    "Genre":"Crime, Drama",
    "Director":"Martin Scorsese",
    "Writer":"Nicholas Pileggi (book), Nicholas Pileggi (screenplay), Martin Scorsese (screenplay)",
    "Actors":"Robert De Niro, Ray Liotta, Joe Pesci, Lorraine Bracco",
    "Plot":"The story of Henry Hill and his life in the mob, covering his relationship with his wife Karen Hill and his mob partners Jimmy Conway and Tommy DeVito in the Italian-American crime syndicate.","Language":"English, Italian","Country":"USA","Awards":"Won 1 Oscar. Another 43 wins & 37 nominations.",
    "Poster":"https://m.media-amazon.com/images/M/MV5BY2NkZjEzMDgtN2RjYy00YzM1LWI4ZmQtMjIwYjFjNmI3ZGEwXkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_SX300.jpg",
    "Ratings":[{"Source":"Internet Movie Database","Value":"8.7/10"},{"Source":"Rotten Tomatoes","Value":"96%"},{"Source":"Metacritic","Value":"89/100"}],
    "Metascore":"89",
    "imdbRating":"8.7",
    "imdbVotes":"855,144",
    "imdbID":"tt0099685",
    "Type":"movie",
    "DVD":"26 Mar 1997",
    "BoxOffice":"N/A",
    "Production":"Warner Bros.",
    "Website":"N/A",
    "Response":"True"
}

И я хотел бы, чтобы все это было под movieInfo. Как это можно сделать?

0
wisnia 20 Авг 2018 в 22:12

3 ответа

Лучший ответ

Решение:

Все должно быть перемещено внутри xhr.onreadystatechange, потому что если нет, то к тому времени, когда я создаю Movie объект, ответ от omdbapi.com все еще не пришел.

xhr.onreadystatechange = function(){
                if(this.readyState == 4 && this.status == 200){
                    *your code here*
                }
}
0
wisnia 22 Авг 2018 в 07:35

Измените тип данных movieInfo на Object.

const movieSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    title: String,
    movieInfo: Object,
    comment: String
});
0
KARTHIKEYAN.A 21 Авг 2018 в 09:19

Отправляется ли запрос с Content-Type - application / json?

0
Vans 21 Авг 2018 в 07:41
51937129