2017-03-06 8 views
0

私は約束に私たちのコードをリファクタリングしています。ノードの返信エラーが正しく(例:検証エラー)

サンプル・コードを持つ2つのブロック:私たちのルートは、ユーザー/インデックスに入力し

user.service.js

export function updateUserProfileByUsername(req, res) { 
userController.getUserByUsername(req.params.username) 
    .then((userProfile) => { 
     return userController.saveUserProfileByUser(userProfile, 
      req.body.email, 
      req.body.username, 
      req.body.firstname, 
      req.body.lastname) 
    }) 
    .then((updated_user) => { 
     res.status(200).json(updated_user.profile); 
    }) 
    .catch((err) => { 
     res.status(404).send('something went wrong'); 
    }); 
} 

export function getUserProfileByUsername(req, res) { 
userController.getUserProfileByUsername(req.params.username) 
    .then((userProfile) => { 
     res.status(200).json(userProfile); 
    }) 
    .catch((err) => { 
     res.status(404).send('something went wrong'); 
    }) 
} 

user.controller.js

export function getUserProfileByUsername(username) { 
return User.findOne({ 
     'username': username 
    }).exec() 
    .then((user) => { 
     if (user) 
      return user.profile; 
     else 
      throw new Error("user not found!"); 
    }); 
} 

export function getUserByUsername(username) { 
return User.findOne({ 
     'username': username 
    }).exec() 
    .then((user) => { 
     if (user) 
      return user; 
     else 
      throw new Error("user not found!"); 
    }); 
} 

export function saveUserProfileByUser(user, email, username, firstname, lastname) { 
    user.email = email; 
    user.username = username; 
    user.firstname = firstname; 
    user.lastname = lastname; 
    return user.save(); // returns a promise 
} 

。 js、service.jsに入り、コントローラがデータベースの作業とエラーを処理します。

達成しようとしているのは、クライアントにフィッティングエラーを送信することです。 間違ったユーザーなどを更新するときに「ユーザーが存在しません」または「ユーザー名が長すぎます」

エラーをクライアントに送信しようとすると、結果として空のjsonが取得されます。 ({})。エラーをログに記録すると、検証エラーを含む完全なスタックトレースが取得されます。

.catch((err) => { 
     console.log(err) // shows me full stacktrace of the error 
     res.status(404).send(err); //sends {} to the client 
    }) 

約束事でこれを実装するにはどうすればよいですか?正しいミドルウェアを追加して正しいエラーメッセージを送信する必要がありますか?

私は本当にこれについて正しい方向にいくつかのヒントをいただきたいと思います。 ありがとうございます!

答えて

0

errがオブジェクトなので、私はexpressをJSONに変換しています。しかし、エラーを文字列化すると '{}'が得られます。

スタックトレースを返す場合は、.send(err.stack)を試してください。

また、スタック全体ではなくメッセージだけが必要な場合は、err.messageを使用できます。

.catch((err) => { 
    console.log(err) 
    res.status(404).send(err.stack); 
}) 
+0

明らかに単純ですが、通常のようです。どうもありがとう! –

関連する問題