2017-09-27 11 views
1

私はWebSocketを使用してchatbotを作成します。各ユーザーは独自のアカウントを持つことができます。私はDjangoのバックエンドとフロントエンドをAngularで書いています。現時点ではメッセージオブジェクトに問題があります。私はバックエンドでこれを手に入れます:DjangoとAngularのWebソケットを使ってユーザーIDでメッセージを送受信するには、どうすればよいですか?

django_1 | django.db.utils.IntegrityError: null value in column "user_id" violates not-null constraint 
django_1 | DETAIL: Failing row contains (212, {"message":"Hello"}, null). 

フロントエンドからユーザーIDを送信しないように見えます。たぶん私はこのようなものを送るべきでしょう{"message":"Hello", "id":1}?私はそれをどのように解決することができ、どのように正しく行われるべきなのだろうか?

export class HomeComponent { 

    response: string; 
    response2: string; 

    constructor(
     private chatService: ChatService, 
     private router: Router, 
     private http: Http, 
    ) { 

     chatService.messages.subscribe(msg => { 
      this.response = msg.message; 
     console.log("Response from backend: " + msg.message); 
     }); 

    } 
    private message = { 
     message: 'this is a test message' 
    } 

    sendMsg() { 
     console.log('new message from client to websocket: ', this.message); 
     this.chatService.messages.next(this.message); 
     return this.message.message; 
    } 

    send(msg) { 
    this.message.message = msg; 
    this.sendMsg(); 
    } 

     login() { 
     return this.http.get('/data',) 
      .map(response => response.json()) 
      .subscribe(response2 => this.response2 = response2); 
    } 


} 

@Component({ 
    selector: 'key-up3', 
    template: ` 
    <input #box (keyup.enter)="keyup7.emit(box.value)"> 
    <p>{{value}}</p> 
    ` 
}) 
export class KeyUpComponent_v3 { 
    @Output() keyup7 = new EventEmitter<string>(); 
} 

UPDATE:

@channel_session_user_from_http 
def msg_consumer(message): 
    text = message.content.get('text') 
    Message.objects.create(
     message=text, 
    ) 
    Group("chat").send({'text': text}) 

@channel_session_user 
def ws_connect(message): 
    # Accept the connection 
    message.reply_channel.send({"accept": True}) 
    # Add to the chat group 
    Group("chat").add(message.reply_channel) 

    message.reply_channel.send({ 
     "text": json.dumps({ 
      'message': 'Welcome' 
     }) 
    }) 

@channel_session_user 
def ws_receive(message): 

    message.reply_channel.send({"accept": True}) 
    print("Backend received message: " + message.content['text']) 
    Message.objects.create(
     message = message.content['text'], 
    ) 

    Channel("chat").send({ 
     "text": json.dumps({ 
      'message': 'Can we start?' 
     }) 
    }) 

@channel_session_user 
def ws_disconnect(message): 
    Group("chat").discard(message.reply_channel) 

これは私の角度成分の一部である:これは私のバックエンドの消費者は

class Message(models.Model): 
    user = models.ForeignKey('auth.User') 
    message = models.CharField(max_length=200) 

です:

私のDjangoのメッセージモデルは、このように見えます 私が解決した瞬間それはバックエンドで以下のように表示されます。

デフws_receive(メッセージ):

message.reply_channel.send({"accept": True}) 
print("Backend received message: " + message.content['text']) 
data = json.loads(message.content['text']) 

Message.objects.create(
    user_id=data['user_id'], 
    message = data['message'], 
) 

答えて

0

エラーがMessageインスタンスがuser_idせずに作成されたことを示すように思われます。 新しいインスタンスを作成するときにこの引数を追加するとどうなりますか?

@channel_session_user_from_http 
def msg_consumer(message): 
    text = message.content.get('text') 
    Message.objects.create(
     user=message.user, # <- Here is the user associated 
     message=text, 
    ) 
    Group("chat").send({'text': text}) 
+0

私はこの '{" message ":" Hello "、" id ":1}'のように本文を送信する必要があることを理解していますか?それとも別のやり方でやるべきか? – wahtdbogh

+0

私はあなたのエラーがあなたが送信しなければならないチャンネルまたはjsonボディに関連しているかどうかはわかりません。しかし、あなたのモデル 'Message'は' user'を 'is_null = True'のない外部キーフィールドとして宣言します。デフォルトで 'is_null = False'であるため、' Message'インスタンスを作成するときには、ユーザインスタンス(またはユーザpk)を指定する必要があります。 – Antwane

関連する問題