- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 csv 文件,想使用 Angular 和 NodeJS 将其中的数据转储到 mongodb 中。
需要帮助使用 Angular 读取 csv 文件的数据并解析它并存储在 mongodb 中
import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';
@Injectable()
export class TemplateService {
domain = 'http://localhost:3000';
constructor(private http: Http) { }
postCsvToMongo(csvJson: any) {
console.log('CSV!!!' + csvJson);
return this.http.post(this.domain + '/fu/fileupload', csvJson).map(res => res.json());
}
}
这是我用来通过 post 路由发送 json 对象的代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>TypeError: Converting circular structure to JSON
<br> at JSON.stringify (<anonymous>)
<br> at router.post (/home/agam/projects/AMEX/routes/fileUpload.js:10:23)
<br> at Layer.handle [as handle_request] (/home/agam/projects/AMEX/node_modules/express/lib/router/layer.js:95:5)
<br> at next (/home/agam/projects/AMEX/node_modules/express/lib/router/route.js:137:13)
<br> at Route.dispatch (/home/agam/projects/AMEX/node_modules/express/lib/router/route.js:112:3)
<br> at Layer.handle [as handle_request] (/home/agam/projects/AMEX/node_modules/express/lib/router/layer.js:95:5)
<br> at /home/agam/projects/AMEX/node_modules/express/lib/router/index.js:281:22
<br> at Function.process_params (/home/agam/projects/AMEX/node_modules/express/lib/router/index.js:335:12)
<br> at next (/home/agam/projects/AMEX/node_modules/express/lib/router/index.js:275:10)
<br> at Function.handle (/home/agam/projects/AMEX/node_modules/express/lib/router/index.js:174:3)
<br> at router (/home/agam/projects/AMEX/node_modules/express/lib/router/index.js:47:12)
<br> at Layer.handle [as handle_request] (/home/agam/projects/AMEX/node_modules/express/lib/router/layer.js:95:5)
<br> at trim_prefix (/home/agam/projects/AMEX/node_modules/express/lib/router/index.js:317:13)
<br> at /home/agam/projects/AMEX/node_modules/express/lib/router/index.js:284:7
<br> at Function.process_params (/home/agam/projects/AMEX/node_modules/express/lib/router/index.js:335:12)
<br> at next (/home/agam/projects/AMEX/node_modules/express/lib/router/index.js:275:10)
</pre>
</body>
</html>
这是我在尝试调试通过 Node 端的 post 请求收到的请求时遇到的错误。以及如何通过后端接收文件?
var csv = require('fast-csv');
var mongoose = require('mongoose');
var Bulletin = require('../models/bulletin');
var multer = require("multer");
module.exports = (router) => {
router.post('/fileupload', (req, res) => {
console.log('@@@ ' + req);
res.send(req.files);
});
/*router.post('/fileupload', multer({dest: "./uploads/"}).array("uploads", 12), function(req, res) {
res.send(req.files);
});*/
return router;
};
这是nodejs代码
1","Fed official says weak data caused by weather, should not slow taper","http://www.latimes.com/business/money/la-fi-mo-federal-reserve-plosser-stimulus-economy-20140310,0,1312750.story\?track=rss","Los Angeles Times","b","www.latimes.com","1394470370698
2","Fed's Charles Plosser sees high bar for change in pace of tapering","http://www.livemint.com/Politics/H2EvwJSK2VE6OF7iK1g3PP/Feds-Charles-Plosser-sees-high-bar-for-change-in-pace-of-ta.html","Livemint","b","www.livemint.com","1394470371207
3","US open: Stocks fall after Fed official hints at accelerated tapering","http://www.ifamagazine.com/news/us-open-stocks-fall-after-fed-official-hints-at-accelerated-tapering-294436","IFA Magazine","b","www.ifamagazine.com","1394470371550
4","Fed risks falling 'behind the curve', Charles Plosser says","http://www.ifamagazine.com/news/fed-risks-falling-behind-the-curve-charles-plosser-says-294430","IFA Magazine","b","www.ifamagazine.com","1394470371793
5","Fed's Plosser: Nasty Weather Has Curbed Job Growth","http://www.moneynews.com/Economy/federal-reserve-charles-plosser-weather-job-growth/2014/03/10/id/557011","Moneynews","b","www.moneynews.com","1394470372027
6","Plosser: Fed May Have to Accelerate Tapering Pace","http://www.nasdaq.com/article/plosser-fed-may-have-to-accelerate-tapering-pace-20140310-00371","NASDAQ","b","www.nasdaq.com","1394470372212
这是我的示例 csv 文件
> amex@1.0.0 start /home/agam/projects/AMEX
> node index.js
(node:6478) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
listening on port 3000
Conected to database: amex
@@@ [object Object]
这就是它正在打印的内容
// 1) Express for nodejs
const express = require('express');
const app = express();
const template = require('./routes/template');
const upload = require('./routes/upload');
const path = require('path');
// const fileUpload = require('express-fileupload');
const router = express.Router();
const fu = require('./routes/fileUpload')(router);
//const carts = require('./routes/carts')(router);
// 5) body parser
const bodyParser = require('body-parser');
const cors = require('cors'); // CORS is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options.
// 2) Mongodb connection
var mongoose = require('mongoose');
const config = require('./config/database');
mongoose.connect(config.uri, (err) => {
if (err) {
console.log('error ' + err);
} else {
console.log('Conected to database: ' + config.db);
}
});
app.use(cors({ origin: 'http://localhost:4200' }));
// 5) put bodyparser code before the routes (converts request to req.body)
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
// 3) connect node.js to angular
app.use(express.static(__dirname + '/client/dist/'));
// app.use(fileUpload());
app.use('/fu', fu); // Use Product routes in application
//app.use('/carts', carts);
//
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname + '/client/dist/index.html'));
});
app.listen(3000, () => {
console.log('listening on port 3000');
});
这是我所期待的 index.js 文件
最佳答案
您好,我对您的 StackBiltz 做了一些更改例如,所以我能够实现通过 post 调用以 JSON 数组的形式发布的有效负载,并创建一个接受此有效负载的服务,并在订阅时将有效负载传递到您的 Node post api
创建了一个名为 pass 的函数
test.component.ts
import { Component, OnInit } from '@angular/core';
import { Router } from "@angular/router";
import { FileUtil } from './file.util';
import { Constants } from './test.constants';
import {TestService} from './test.service';
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.css']
})
export class TestComponent implements OnInit {
fileImportInput: any;
data;
csvRecords:any = [];
constructor(private _router: Router,
private _fileUtil: FileUtil,private testService:TestService
) { }
ngOnInit() {
}
// METHOD CALLED WHEN CSV FILE IS IMPORTED
fileChangeListener($event): void {
var text = [];
var target = $event.target || $event.srcElement;
var files = target.files;
if (Constants.validateHeaderAndRecordLengthFlag) {
if (!this._fileUtil.isCSVFile(files[0])) {
alert("Please import valid .csv file.");
this.fileReset();
}
}
var input = $event.target;
var reader = new FileReader();
reader.readAsText(input.files[0]);
reader.onload = (data) => {
let csvData = reader.result;
let csvRecordsArray = csvData.split(/\r\n|\n/);
var headerLength = -1;
if (Constants.isHeaderPresentFlag) {
let headersRow = this._fileUtil.getHeaderArray(csvRecordsArray, Constants.tokenDelimeter);
headerLength = headersRow.length;
}
this.csvRecords = this._fileUtil.getDataRecordsArrayFromCSVFile(csvRecordsArray,
headerLength, Constants.validateHeaderAndRecordLengthFlag, Constants.tokenDelimeter);
this.passThisFunction(this.csvRecords);
console.log('this.csvRecords',this.csvRecords);
if (this.csvRecords == null) {
//If control reached here it means csv file contains error, reset file.
this.fileReset();
}
}
reader.onerror = function () {
alert('Unable to read ' + input.files[0]);
};
};
fileReset() {
this.fileImportInput.nativeElement.value = "";
this.csvRecords = [];
}
passThisFunction(records:any){
console.log('inside function call');
console.log('records',records);
let json=JSON.stringify(records);
console.log('jsonified',json);
var str = json.replace(/},/g, "},\r\n");
console.log('das' + str);
this.testService.postCsvToMongo(str).subscribe((data) => {
console.log(data);
});
}
}
test.component.html
<h4>Read .CSV File using Angular2, JQuery and Bootstrap</h4>
<table>
<tr>
<td>
<input type="file"
#fileImportInput
name="File Upload"
id="txtFileUpload"
class="btn btn-primary"
(change)="fileChangeListener($event)"
accept=".csv"
/>
</td>
</tr>
</table>
<div>
<table class="table table-responsive table-hover" border="1"
style="width : 50%;">
<tbody>
<ng-container >
<tr >
<td *ngFor="let csvRec of csvRecords;let i=index">{{csvRec}}</td>
</tr>
</ng-container>
</tbody>
</table>
</div>
file.util.ts
import { Injectable } from '@angular/core';
@Injectable()
export class FileUtil {
constructor() {}
isCSVFile(file) {
return file.name.endsWith(".csv");
}
getHeaderArray(csvRecordsArr, tokenDelimeter) {
let headers = csvRecordsArr[0].split(tokenDelimeter);
let headerArray = [];
for (let j = 0; j < headers.length; j++) {
headerArray.push(headers[j]);
}
return headerArray;
}
validateHeaders(origHeaders, fileHeaaders) {
if (origHeaders.length != fileHeaaders.length) {
return false;
}
var fileHeaderMatchFlag = true;
for (let j = 0; j < origHeaders.length; j++) {
if (origHeaders[j] != fileHeaaders[j]) {
fileHeaderMatchFlag = false;
break;
}
}
return fileHeaderMatchFlag;
}
getDataRecordsArrayFromCSVFile(csvRecordsArray, headerLength,
validateHeaderAndRecordLengthFlag, tokenDelimeter) {
console.log(csvRecordsArray);
console.log(headerLength);
console.log(validateHeaderAndRecordLengthFlag);
console.log(tokenDelimeter);
var dataArr:any = [];
for (let i = 0; i < csvRecordsArray.length; i++) {
let data = csvRecordsArray[i].split(tokenDelimeter);
if(validateHeaderAndRecordLengthFlag && data.length != headerLength){
if(data==""){
alert("Extra blank line is present at line number "+i+", please remove it.");
return null;
}else{
alert("Record at line number "+i+" contain "+data.length+" tokens, and is not matching with header length of :"+headerLength);
return null;
}
}
dataArr=data;
console.log('dataArr',dataArr);
}
return dataArr;
}
}
test.service.ts
import{Injectable} from '@angular/core';
import{Http} from '@angular/http';
import {map} from 'rxjs/operators';
@Injectable()
export class TestService{
API_URL:string='your api url';
constructor(private http:Http){}
postCsvToMongo(csvJson:any){
return this.http.post(this.API_URL,csvJson)
.pipe(map((res)=>console.log(res)));
}
}
关于javascript - 如何使用 Angular 和 NodeJS 将 csv 数据转储到 mongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51869761/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!