Узел JS Callback функция ничего не возвращает - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в узле JS Development.Я только недавно выучил узел js.Здесь я создаю файл маршрутизатора

import express from 'express';
import storyController from '../../controllers/story';

const router = express.Router();
router.post('/', (req, res) => {
 const { author, title } = req.body;
 console.log(author);    
 const story = {
    author: req.body.author,
    title: req.body.title,
    content: req.body.content,
    tags: req.body.tags
 };
 storyController.createStory(story, function(error, result){
    console.log("halo");
    if(error)
        res.status(500).send({ success: false, message: error.message});
    res.status(200).send({ success: true, message: "Success"});
  });
});

Затем я создаю еще один файл, называемый здесь контроллером

import mongoose from 'mongoose';
const Story = mongoose.model('Story');

exports.createStory = async (story) => {
 const { author, title } = story;
 if(!author){
    console.log("hahaAuthor");
    return {
        error: true,
        message: 'You must write an author name!'
    };
 }
 if(!title) {
    console.log("haha");
    return {
        error: true,
        message: 'You must write a title!'
    }
 }
 const newStory = new Story({
    author: author,
    title: title,
    content: story.content,
    tags: story.tags,
    slug: ''
 });

 newStory.save().then((story) => {   
    return { error: false, result: story};
 }).catch((error) => {
    return { error: error};
 })
};

Но, к сожалению, я не знаю, почему моя функция в файле маршрутизаторане вызывает функцию обратного вызова.Console.log еще даже не вызывал.Пожалуйста помоги.В противном случае, возможно, у вас есть лучший способ сделать это.Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Может быть, это может работать:

// 1. callback style
newStory.save().then((story) => {   
  return cb(null, story);
}).catch((error) => {
  return cb(error);
})

// 2. await
await newStory.save();

// controller
router.post('/', (req, res) => {
storyController.createStory.then(data => {
    return res.json(...);
}).catch(e => {
    return res.json(...); 
});

Если вы используете стиль callback, Error-First Callback лучше.

0 голосов
/ 08 октября 2018

As createStory - асинхронная функция.Измените свой код следующим образом.Вы смешиваете async с Promise и callback

exports.createStory = async (story) => {
    ...
    // Change the promise to await
    let story = await newStory.save();
    return { error: false, result: story};
};

Ошибка должна обрабатываться в контроллере с помощью предложения Promise catch.

Что-то вроде

router.post('/', (req, res) => {
    storyController.createStory.then(data => {
        return res.json({error: false, data: data});
    }).catch(e => {
        return res.json({error: true}); 
    })
});

Примечание: Either use callback or async. async is the best option now adays

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...