🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

860閲覧

Node.js+express+MongoDB+Mongooseでjsonサーバを構築する際のエラー

asasaas

総合スコア26

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2019/12/11 06:48

編集2019/12/11 09:02

Node.js+express+MongoDB+Mongooseでユーザ認証の機能を実装しようとしています.
フロントエンドはPOSTリクエストによって認証を要求します.
リクエスト内容はJSON形式で記述されています.

request

1{ 2 "username" : String 3 "password" : String 4}

サーバはusernameでDBのusersコレクションを参照し,
usernameが存在した場合はpasswordと照合してその結果をフロントエンドに返します.
usernameが存在しなかった場合,usernameとpasswordを新規登録します.

userjs

1var mongoose = require('mongoose'); 2var Schema = mongoose.Schema; 3 4var User = new Schema({ 5 username : { type: String, require: true, unique: true }, 6 password : { type: String, require: true } 7}); 8 9module.exports = mongoose.model('user', User);

appjs

1var express = require('express'); 2var path = require('path'); 3//var favicon = require('serve-favicon'); 4var bodyParser = require('body-parser'); 5var logger = require('morgan'); 6var ect = require('ect'); 7var db = require('./models/db'); 8var cookieParser = require('cookie-parser'); 9 10var app = express(); 11 12var routes = require('./routes/index'); 13var api = require('./routes/api'); 14 15 16 17// view engine setup 18/* 19app.set('views', path.join(__dirname, 'views')); 20app.set('view engine', 'jade'); 21*/ 22 23app.engine('ect', ect({ watch: true, root: __dirname + '/views', ext: '.ect' }).render); 24app.set('view engine', 'ect'); 25 26// uncomment after placing your favicon in /public 27//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 28app.use(logger('dev')); 29app.use(bodyParser.json()); 30app.use(bodyParser.urlencoded({ extended: false })); 31app.use(cookieParser()); 32app.use(express.static(path.join(__dirname, 'public'))); 33 34app.use('/', routes); 35app.use('/api', api); 36 37// catch 404 and forward to error handler 38app.use(function(req, res, next) { 39 var err = new Error('Not Found'); 40 err.status = 404; 41 next(err); 42}); 43 44// error handlers 45 46// development error handler 47// will print stacktrace 48if (app.get('env') === 'development') { 49 app.use(function(err, req, res, next) { 50 res.status(err.status || 500); 51 res.render('error', { 52 message: err.message, 53 error: err 54 }); 55 }); 56} 57 58// production error handler 59// no stacktraces leaked to user 60app.use(function(err, req, res, next) { 61 res.status(err.status || 500); 62 res.render('error', { 63 message: err.message, 64 error: {} 65 }); 66}); 67 68 69module.exports = app; 70

apijs

1var express = require('express'); 2var bodyParser = require('body-parser'); 3var router = express.Router(); 4var mongoose = require('mongoose'); 5 6// モデルの宣言 7var User = require('../../models/user'); 8 9// POSTリクエストがきた時の処理 10/* POST内容はJSON形式で飛ばされる 11 * JSON format 12 * { 13 * "username" : String 14 * "password" : String 15 * } 16 */ 17router.post('/grid/test', function(request, response){ 18 console.log("catch the post request"); 19 response.setHeader('Content-Type', 'text/plain'); 20 21 // パラメータ名、usernameとpassを出力 22 console.log(request.body.username); 23 console.log(request.body.password); 24 25 var username = request.body.username; 26 var password = request.body.password; 27 28 User.find({ "username" : username }, function(err, result){ 29 if (err) 30 console.log(err); 31 32 // 新規登録 33 if (result.length == 0){ 34 var user = new User(); 35 36 user.username = username; 37 user.password = password; 38 39 user.save(function(err){ 40 if (err) console.log(err); 41 response.send("new_created"); 42 }); 43 } 44 // usernameがDBに存在した場合 45 else{ 46 if (result[0].password == password) 47 response.send("true"); 48 else 49 response.send("false"); 50 } 51 }); 52}); 53 54module.exports = router;

python

1# -*- coding: utf-8 -*- 2 3import os 4import os.path 5import math 6import requests 7import datetime 8from collections import Counter 9from time import sleep 10import json 11 12 13HOSTNAME = "localhost" 14PORT = "3000" 15URL = "http://" + HOSTNAME + ":" + PORT + "/api/grid/test" 16 17 18def user(): 19 default_params = { 20 21 } 22 23 data = { 24 'username' : String, 25 'password' : String, 26 } 27 28 29 #print(data) 30 31 # データをjsonファイルとしてpost 32 requests.post(URL, json.dumps(data), headers={'Content-Type': 'application/json'}) 33 34if __name__ == "__main__": 35 user() 36

これを実行したら、

error

1NameError: name 'String' is not defined

というエラーが出てしまいます。
何か間違っているところはないか知りたいです。

なお、既存のプログラムに追記をしている為、無駄なコードもあるかと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Python側でのエラーだったら

python

1 data = { 2 'username' : String, 3 'password' : String, 4 }

これじゃないのかな(Stringではなくユーザー名及びパスワードを文字列として入れないといけないのでは)


コメントでのエラー内容を環境作って試しました

app.js

js

1// server.js 2 3// 必要なパッケージの読み込み 4var express = require('express'); 5var app = express(); 6var bodyParser = require('body-parser'); 7 8var mongoose = require('mongoose'); 9 10// DBへの接続 11var mongoose = require('mongoose'); 12mongoose.connect('mongodb://localhost/backend'); 13 14// モデルの宣言 15var User = require('./models/user'); 16 17// POSTでdataを受け取るための記述 18app.use(bodyParser.urlencoded({ extended: true })); 19app.use(bodyParser.json()); 20 21// 3000番を指定 22var port = process.env.PORT || 3000; 23 24// expressでAPIサーバを使うための準備 25var router = express.Router(); 26 27router.use(function(req, res, next) { 28 console.log('Something is happening.'); 29 next(); 30}); 31 32// 正しく実行出来るか左記にアクセスしてテストする (GET http://localhost:3000/api) 33router.post('/', function(request, response){ 34 console.log("catch the post request"); 35 response.setHeader('Content-Type', 'text/plain'); 36 37 // パラメータ名、usernameとpassを出力 38 console.log(request.body.username); 39 console.log(request.body.password); 40 41 var username = request.body.username; 42 var password = request.body.password; 43 44 User.find({ "username" : username }, function(err, result){ 45 if (err) 46 console.log(err); 47 48 // 新規登録 49 if (result.length == 0){ 50 var user = new User(); 51 52 user.username = username; 53 user.password = password; 54 55 user.save(function(err){ 56 if (err) console.log(err); 57 response.send("new_created"); 58 }); 59 } 60 // usernameがDBに存在した場合 61 else{ 62 if (result[0].password == password) 63 response.send("true"); 64 else 65 response.send("false"); 66 } 67 }); 68}); 69 70// ルーティング登録 71app.use('/api', router); 72 73//サーバ起動 74app.listen(port); 75console.log('listen on port ' + port);

user.js

js

1var mongoose = require('mongoose'); 2var Schema = mongoose.Schema; 3 4var User = new Schema({ 5 username : { type: String, require: true, unique: true }, 6 password : { type: String, require: true } 7}); 8 9module.exports = mongoose.model('user', User);

curl -X POST -H "Content-Type: application/json" -d '{"username": "username", "password": "password"}' localhost:3000/apinew_createdと帰ってきたので、乗ってないソース部分でなってますね

投稿2019/12/11 06:55

編集2019/12/11 09:31
rururu3

総合スコア5545

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asasaas

2019/12/11 07:21

回答ありがとうございます。 そちらが原因だったようで、該当のエラーは解消されたのですが、また別のエラーが発生してしまった為そちらも分かりましたらご教授お願いします。 エラー内容 (node:8664) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'split' of undefined (node:8664) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2) (node:8664) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
rururu3

2019/12/11 08:03

環境つくれないので試せないけど、とりあえずエラー内容からしてpromiseでのcacheがないから出るエラーっぽいですね。splitが関係しそうだけどないしなぁ…
AkitoshiManabe

2019/12/11 08:14

mongoose.connect() してる箇所が見当たらないのが気になります
asasaas

2019/12/11 08:47

mongoose.connect() を入れても変わりませんでした。 他の処理はこれでいけてるのですが、、、
rururu3

2019/12/11 08:50

mongodb入れて、上記ソースで動くか試してみるか
asasaas

2019/12/11 09:02

そこまでして頂けるとは、とても助かります。
rururu3

2019/12/11 09:28

回答編集するけど、とりあえず動いたので、上記に載ってないソース部分でなってる気がする
asasaas

2019/12/13 08:10

ありがとうございます、自分が無知な部分も多く何が原因なのか全くわからないです。。 もう一度見直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問