Как отправить ngTagsInput с помощью multipart-формы в angularjs

В моем приложении angularjs я использую плагин ngTagsInput для получения тегов от пользователя. И хотите отправить эти теги, некоторые поля и один файл (изображение или видео) на стороне сервера,

СТОРОНА КЛИЕНТА

HTML

<div class="main-wrapper" ng-controller="HomeController">
  <input vs-google-autocomplete="locOptions" ng-model="place" name="ccity" type="text" size="25">
  <tags-input ng-model="post.tagList" add-on-paste="true" style="width:200px">
    <auto-complete min-length="1" source="loadTags($query)"></auto-complete>
  </tags-input>
  <input type="file" name="file" file-model="post.file"/>
  <button ng-click="submitPost()" class="btn btn-sm btn-primary mr-2">Post</button>
</div>

app.js

var app = angular.module('App',['ngTagsInput']);

// controller
app.controller('HomeController', ['$scope', 'pservice', function ($scope, pservice) {
    $scope.submitPost = () => {        
        console.log($scope.post.tagList);
        $scope.post.place = $scope.place; 
        var data = $scope.post;       
        pservice.add(data, '/p/add');  //service called sending data and url 
    };  
}]);

//directive
app.directive('fileModel', ['$parse', function ($parse) {
    return {
        restrict: 'A',
        link: function (scope, element, attrs) {
            var model = $parse(attrs.fileModel);
            var modelSetter = model.assign;
            element.bind('change', function () {
                scope.$apply(function () {
                    modelSetter(scope, element[0].files[0]);
                });
            });
        }
    };
}]);

//service
app.service('pservice', ['$http',  function ($http) {

    this.add = function (data, uploadUrl) {                         

            var fd = new FormData();
            angular.forEach(data.file, function (file) {
                fd.append("file", file);
            });           
            for (var key in data) {                
                fd.append(key, data[key]);
            } 
            $http({
                method: 'POST',
                url: uploadUrl,
                transformRequest: angular.identity,
                headers: {
                    'Content-Type': undefined
                },
                data: fd
            }).then(function successCallback(response) {
                console.log(response.data);               
            }, function errorCallback(response) {
                console.error(response);
            });
    };

}]);

Консоль браузера

[{"id":"1","text":"Pink"},{"id":"2","text":"Red"}]

СЕЙЧАС СЕРВЕРНАЯ СТОРОНА

NodeJS на стороне сервера.

multer для обработки файлов.

const express = require('express');
const router = express.Router();
const multer = require('multer');
const path = require('path');
const bodyParser = require('body-parser');
app.use(bodyParser.json({
    limit: '5mb'
}));
app.use(bodyParser.urlencoded({
    extended: true
}));

var storage = multer.diskStorage({
    destination: 'media/',
    filename: function (req, file, cb) {
        cb(null, path.extname(file.originalname))
    }
})

var upload = multer({
    storage: storage
}) 



app.post('/p/add', upload.single('file'), (req, res, next) => {

    console.log(req.body.tagList);  // <========

    res.status(200).json({
        msg:'It's ok'
    });

});

некоторые моменты,

  • Я отправил с файлом и некоторыми данными, поэтому я использую multipart/form-data
  • плагин multer работает правильно, файл сохраняется на стороне сервера.

проблема,

Я пытаюсь получить req.body.tagList он возвращает (два тега со стороны клиента)

[object Object],[object Object]

Я хочу получить эти теги и сохранить в базу данных, один за другим. Но я не понимаю, как это сделать.

ПОЖАЛУЙСТА ПОМОГИ

0 ответов

Другие вопросы по тегам